Linux_*线程同步与互斥*

一.互斥量

   1.作用:因为线程可以共享资源,所以多个线程可以同时访问一块资源。多个线程操作共享变量时,可以有序进行,不会对变量同时修改

   2.互斥量的接口

      定义互斥量-->初始化互斥量-->上锁-->解锁-->销毁

      来不及解释了,直接上代码(一个简易的售票系统)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <pthread.h>
  4 
  5 int ticket1 = 30;
  6 pthread_mutex_t mutex;
  7 
  8 void *ticket(void * arg){
  9     char * per=(char *) arg;
 10     while(1){
 11         pthread_mutex_lock(&mutex);//上锁,1进入变成0,若为0等待
 12         if(ticket1>=0){
 13             sleep(1);
 14             printf("%s buy %d ticket\n",per,ticket1);
 15             ticket1-=1;
 16             pthread_mutex_unlock(&mutex);//解锁
 17         }else{
 18             pthread_mutex_unlock(&mutex);//解锁
 19             printf("out of stock!\n");
 20             break;
 21         }
 22     }
 23 }
 24 
 25 int main(void){
 26     pthread_mutex_init(&mutex,NULL);//初始化,一般为1
 27     pthread_t t1,t2,t3,t4,t5;
 28     pthread_create(&t1,NULL,ticket,"thread1");
 29     pthread_create(&t2,NULL,ticket,"thread2");
 30     pthread_create(&t3,NULL,ticket,"thread3");
 31     pthread_create(&t4,NULL,ticket,"thread4");
 32     pthread_create(&t5,NULL,ticket,"thread5");
 33 
 34 
 35     pthread_join(t1,NULL);
 36     pthread_join(t2,NULL);
 37     pthread_join(t3,NULL);
 38     pthread_join(t4,NULL);
 39     pthread_join(t5,NULL);
 40     pthread_mutex_destroy(&mutex);//销毁互斥量
 41 }  

   注意:不要销毁已经加锁的互斥量,已经销毁了的互斥量不要再进行加锁,使用PTHREAD_MUTEX_INITIALIZER初始化的互斥量不用销毁。

二.条件变量

  1.作用:当一个线程互斥的访问某个变量时,他可能发现在其他线程改变状态之前,自己什么也不能做,比如一个线程访问队列时,队列为空,线程只能等待其他线程添加节点到队列中,在这种情况下就用到了条件变量

  2.条件变量的使用

    定义-->初始化-->等待条件满足-->唤醒等待-->销毁

    老规矩,直接上代码(生产消费者模型)

猜你喜欢

转载自blog.csdn.net/Warrior_Harlan/article/details/81205371
今日推荐