线程同步中的死锁现象

本文详细解析了死锁发生的两种常见情景:同一线程对同一互斥量进行两次加锁,以及两个线程分别持有不同互斥量并互相请求对方持有的锁。通过具体代码实例,阐述了死锁现象及如何通过trylock避免死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现死锁的情况:1. 线程出现对同一个互斥量A加锁两次;
2.线程1拥有A锁,请求获取B锁;线程2拥有B锁,请求获取A锁;
第一种情况实例代码:

 1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <pthread.h>
  5 #include <unistd.h>
  6 pthread_mutex_t mutex;//定义锁
  7 void* tfn(void* arg)
  8 {
  9         srand(time(NULL));
 10         while(1)
 11         {
 12                 pthread_mutex_lock(&mutex);
 13                 printf("hello ");
 14                 sleep(rand()%3);
 15                 printf("world\n");
 16                 **pthread_mutex_lock(&mutex);(两次加锁会导致死锁**)因为第二次再调用lock会试图加锁,但是加锁是不会成功的,因为第一次已经加锁,但是lock函数是阻塞的,此时会导致一直等待加锁,自己将自己锁死;
 17                 //pthread_mutex_unlock(&mutex);
 18                 sleep(rand()%3);
 19         }
 20         return NULL;
 21 }
 22 
 23 int main()
 24 {
 25         int flag = 5;
 26 
 27         pthread_t tid;
 28         srand(time(NULL));
 29         pthread_mutex_init(&mutex,NULL);//mutex == 1
 30         pthread_create(&tid,NULL,tfn,NULL);
 31         while(flag--)
 32         {
 33                 pthread_mutex_lock(&mutex);
 34                 printf("HELLO ");
 35                 sleep(rand()%3);
 36                 printf("WORLD\n");
 37                 pthread_mutex_unlock(&mutex);
 38                 sleep(rand()%3);
 39 
 40         }
 41         pthread_cancel(tid);
 42         pthread_join(tid,NULL);
 43         pthread_mutex_destroy(&mutex);//mutex == 0
 44 
 45         return 0;
 46 }
第二种情况实例:t1线程拿着A锁请求B锁,t2线程拿着B锁请求A锁;这个时候由于t1和t2都没有放开各自的锁,所以各自再申请锁的时候会一直阻塞,导致死锁;可以使用trylock,然后不成功的话会返回,此时如果拿不到锁的话就放弃自己的锁,等别的线程加锁访问完数据后最后再试图加锁访问数据;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值