一.互斥量
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.条件变量的使用
定义-->初始化-->等待条件满足-->唤醒等待-->销毁
老规矩,直接上代码(生产消费者模型)