(五)linux线程编程学习笔记——线程同步及互斥锁

先上错误代码

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<pthread.h>
 4 #include<unistd.h>
 5 static int Number=0;
 6 void* test1(){
 7         int tmp=0;
 8         for(int i=0;i<50;i++){
 9                 tmp=Number;
10                 tmp++;
11                 usleep(3);
12                 Number=tmp;
13             printf("test1:Number:%d\n",Number);
14         }
15 };
16   
17 void* test2(){
18         int tmp=0;
19         for(int i=0;i<50;i++){
20                 tmp=Number;
21                 tmp++;
22                 usleep(3);
23                 Number=tmp;
24 
25             printf("test2:Number:%d\n",Number);
26         }
27 }
28 
29 int main(){
30   pthread_t tid1;
31   pthread_t tid2;
32 
33   pthread_create(&tid1,NULL,test1,NULL);
34   pthread_create(&tid2,NULL,test2,NULL);
35 
36   pthread_join(tid1,NULL);
37   pthread_join(tid2,NULL);
38   return 0;
39 }

本意是将所有number打印出来,也就是两个50此循环,也就是最终应该打印出Number=100,但实际每次执行都会不一样。这时候就要用到线程同步技术了。所谓互斥方式其实就是将传统的多线程方式转换成单线程模式,待一个线程执行完,只要锁没有释放,其他线程就无法进入临界区代码执行,只有释放了锁后,其他线程才能进入临界区执行,保证了数据的一致性。

正确代码如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<pthread.h>
 4 #include<unistd.h>
 5 static int Number=0;
 6 pthread_mutex_t mutex;//声明锁
 7 void* test1(){
 8         int tmp=0;
 9         for(int i=0;i<50;i++){
10                 pthread_mutex_lock(&mutex);//加锁
11                 tmp=Number;
12                 tmp++;
13                 usleep(3);
14                 Number=tmp;
15             printf("test1:Number:%d\n",Number);
16            pthread_mutex_unlock(&mutex);//解锁
17         }
18 };
19 
20 void* test2(){
21         int tmp=0;
22         for(int i=0;i<50;i++){
23 
24                 pthread_mutex_lock(&mutex);//加锁
25                 tmp=Number;
26                 tmp++;
27                 usleep(3);
28                 Number=tmp;
29 
30             printf("test2:Number:%d\n",Number);
31            pthread_mutex_unlock(&mutex);//解锁
32         }
33 }
34 
35 int main(){
36   pthread_t tid1;
37   pthread_t tid2;
38   pthread_mutex_init(&mutex,NULL);//锁初始化
39 
40   pthread_create(&tid1,NULL,test1,NULL);
41   pthread_create(&tid2,NULL,test2,NULL);
42 
43   pthread_join(tid1,NULL);//阻塞方式释放线程资源
44   pthread_join(tid2,NULL);//阻塞方式释放线程资源
45   pthread_mutex_destroy(&mutex);//销毁锁
46   return 0;
47 }

 

posted @ 2021-05-20 20:49  疯狗强尼  阅读(50)  评论(0编辑  收藏  举报