(五)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 }