Linux线程——死锁

什么是死锁

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

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

死锁发生的原因

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

Linux线程——死锁_第1张图片

如何避免死锁

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

代码示例

Linux线程——死锁_第2张图片

#include 
#include 

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;
}

Linux线程——死锁_第3张图片

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

你可能感兴趣的:(linux)