线程同步中的死锁现象

出现死锁的情况: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,然后不成功的话会返回,此时如果拿不到锁的话就放弃自己的锁,等别的线程加锁访问完数据后最后再试图加锁访问数据;

猜你喜欢

转载自blog.csdn.net/weixin_37603532/article/details/89462853