Linux线程——死锁

发布时间:2023年12月20日

什么是死锁

死锁是一组相互竞争资源的线程因为他们之间得到互相等待导致“永久“阻塞的现象;(你等我 我等你 你不放我也不放 就导致“永久“阻塞的现象)

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

死锁发生的原因

互斥条件共享资源 X y 只能被一个线程占有
占用且等待线程T1占用的共享资源X 他在等待共享Y的时候帮不释放自己的X
不可抢占其他线程不能去抢占t1线程占有的资源
循环等待线程t1 等t2 占有的资源,线程t2 等t1占有的资源 循环等等

如何避免死锁

互斥条件无法破坏的因为锁本身就是通过互斥解决线程的安全的问题
占用且等待?一次性申请所有的资源就不会存在等待了
不可抢占占用部分资源的线程,进一步申请其他的资源的时候如果申请不到可以主动释放他占有的资源,这样就破坏了不可抢占
循环等待占用部分资源的线程,进一步申请其他的资源的时候如果申请不到可以主动释放他占有的资源,这样就破坏了不可抢占

代码示例

#include <stdio.h>
#include <pthread.h>

int data = 0;

pthread_mutex_t mutex;
pthread_mutex_t mutex2;

void *func1(void *arg)
{
	int i;
	pthread_mutex_lock(&mutex);//锁1上锁
	sleep(1);//延时1s时func2拿到锁2
	pthread_mutex_lock(&mutex2);//想要得到锁2

	for(i=0;i<5;i++)
	{
        printf("t1:this thread t1:%ld \n",(unsigned long)pthread_self());
        printf("t1:num=%d\n",*((int *)arg));
	}
    pthread_mutex_unlock(&mutex);

}

void *func2(void *arg)
{
    pthread_mutex_lock(&mutex2);//锁2上锁
	sleep(1);//延时1s
	pthread_mutex_lock(&mutex);//想要得到锁1,但func1已经拿到锁1
    printf("t2:this thread t2:%ld \n",(unsigned long)pthread_self());
    printf("t2:num=%d\n",*((int *)arg));
    pthread_mutex_unlock(&mutex);
}

int main()
{
    int ret;
    int num =999;
    pthread_t t1;
	pthread_t t2;
	
	pthread_mutex_init(&mutex,NULL);
	pthread_mutex_init(&mutex2,NULL);
	
    ret = pthread_create(&t1,NULL,func1,(void *)&num);
    if(ret == 0)
	{
        printf("main:create t1 success\n");
    }

	ret = pthread_create(&t2,NULL,func2,(void *)&num);
    if(ret == 0)
    {
        printf("main:create t2 success\n");
    }
    
    printf("main:%ld\n",(unsigned long)pthread_self());	

	pthread_join(t1,NULL);
	pthread_join(t2,NULL);	

	pthread_mutex_destroy(&mutex);
	pthread_mutex_destroy(&mutex2);
    return 0;
}

线程一想要线程二手上的锁,线程二也想要线程一手上的锁,所以都不去解锁,造成死锁。

文章来源:https://blog.csdn.net/2301_78772787/article/details/135115243
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。