互斥锁:
 
  一、 对于多个线程访问共享资源时,会发生冲突,引入互斥锁能够解决这个问题,如果一个线程获得锁,而另一个线程去申请锁,则需要挂起等待,等待释放锁,则该线程被唤醒,继续获得锁执行。

   
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