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