注意:
使用互斥锁在访问共享资源前加锁,访问后立即解锁。锁的“粒度”越小越好(锁里的动作越少越好)
死锁:
- 线程对同一个互斥锁连续加锁两次
- 线程a、b各加了一个不同的锁,却不解开,而去试图加锁其他锁
28 #include<stdio.h>
29 #include<pthread.h>
30 #include<unistd.h>
31 #include<stdlib.h>
32 //定义全局变量:锁
33 pthread_mutex_t mutex;
//pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;(静态初始化)
34 void *th1(void *)
35 {
36 while(1){
37 //加锁
38 pthread_mutex_lock(&mutex);
39 printf("hello \n");
40 sleep(3);
41 printf("world\n");
42 pthread_mutex_unlock(&mutex);
43 sleep(4);
44 }
45 }
46 void *th2(void *)
47 {
48 while(1){
49 //加锁
50 pthread_mutex_lock(&mutex);
51 printf("HELLO \n");
52 sleep(2);
53 printf("WORLD\n");
54 pthread_mutex_unlock(&mutex);
55 sleep(3);
56 }
57
58 }
59 void main(void)
60 {
61 //创建两个线程
62 pthread_t TH1,TH2;
63 pthread_create(&TH1,NULL,th1,NULL);
64 pthread_create(&TH2,NULL,th2,NULL);
65 //初始化互斥锁,动态初始化
66 pthread_mutex_init(&mutex,NULL);
67
68 while(1);
69 //回收线程
70 pthread_join(TH1,NULL);
71 pthread_join(TH2,NULL);
72 }