线程同步
2016-06-12 12:47
417 查看
互斥锁: 一、 对于多个线程访问共享资源时,会发生冲突,引入互斥锁能够解决这个问题,如果一个线程获得锁,而另一个线程去申请锁,则需要挂起等待,等待释放锁,则该线程被唤醒,继续获得锁执行。 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); 返回值: 成功返回0,失败返回错误码。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<pthread.h> 4 5 static int val=0; 6 void* read_write_mem(void* arg) 7 { 8 int i=0; 9 int count=0; 10 while(i<5000) 11 { 12 count=val; 13 printf("tid:%ld,count:%d\n",pthread_self(),count); 14 val=count+1; 15 i++; 16 } 17 return NULL; 18 } 19 int main() 20 { 21 pthread_t tid1,tid2; 22 pthread_create(&tid1,NULL,read_write_mem,NULL); 23 pthread_create(&tid2,NULL,read_write_mem,NULL); 24 pthread_join(tid1,NULL); 25 pthread_join(tid2,NULL); 26 printf("final:%d\n",val); 27 return 0; 28 } 结果: ... tid:-1217189008,count:5359 tid:-1217189008,count:5360 tid:-1217189008,count:5361 tid:-1217189008,count:5362 tid:-1217189008,count:5363 tid:-1217189008,count:5364 tid:-1217189008,count:5365 tid:-1217189008,count:5366 tid:-1217189008,count:5367 tid:-1217189008,count:5368 tid:-1217189008,count:5369 tid:-1217189008,count:5370 tid:-1217189008,count:5371 tid:-1217189008,count:5372 tid:-1217189008,count:5373 tid:-1217189008,count:5374 tid:-1217189008,count:5375 tid:-1217189008,count:5376 tid:-1217189008,count:5377 tid:-1217189008,count:5378 tid:-1217189008,count:5379 final:5380 很明显:最终结果是错误的。 引入互斥锁: ... ... 5 static int val=0; 6 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 7 void* read_write_mem(void* arg) ... 11 while(i<5000) 12 { 13 pthread_mutex_lock(&mutex); 14 count=val; 15 printf("tid:%ld,count:%d\n",pthread_self(),count); 16 val=count+1; 17 i++; 18 pthread_mutex_unlock(&mutex); 19 } ... ... 27 pthread_join(tid1,NULL); 28 pthread_join(tid2,NULL); 29 pthread_mutex_destroy(&mutex); 30 printf("final:%d\n",val); 结果: ... tid:-1227846800,count:9992 tid:-1227846800,count:9993 tid:-1227846800,count:9994 tid:-1227846800,count:9995 tid:-1227846800,count:9996 tid:-1227846800,count:9997 tid:-1227846800,count:9998 tid:-1227846800,count:9999 final:10000本文出自 “liveyoung” 博客,转载请与作者联系!