linux 多线程-条件变量
来源:互联网 发布:ios10数据开关 编辑:程序博客网 时间:2024/04/29 11:43
参考: http://blog.csdn.net/KataDoc360/article/details/3897957
互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线承间的同步。
件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
首先介绍关键函数
pyhread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
************pthread_cond_wait()的使用方法**********/
pthread_mutex_lock(&mutex); /*lock*/
pthread_cond_wait(&cond, &mutex);/*block-->unlock-->wait() return-->lock*/
pthread_mutex_unlock(&mutex); /*unlock*/
/*****************************************************/
线程首先获得锁,进入条件等待,当条件不成立的时候wait函数首先解锁mutex,然后进入休眠等待信号激活,
当有信号激活时,首先获得互斥锁,然后执行。。。最后释放锁。
参考:http://blog.csdn.net/zclongembedded/article/details/7323816
#include<sys/types.h>#include <pthread.h>#include <stdio.h>#include <stdlib.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/unsigned count = 0;void *thread1_decrement_count(){ pthread_mutex_lock(&mutex); while(count == 0 ) { printf("thread1:加锁, count=%d, 开始wait %d \n",count, __LINE__); pthread_cond_wait(&cond, &mutex);//1.解锁,进入休眠等待信号激活.4.被激活之后首先获得锁 printf("thread1:wait被激活 %d \n", __LINE__);// } count = count - 1; pthread_mutex_unlock(&mutex);//5.解锁 printf("thread1:解锁count=%d, %d \n",count, __LINE__);}void *thread2_increment_count(){ pthread_mutex_lock(&mutex); printf("thread2:加锁, count=%d, %d \n",count, __LINE__); if(count==0) pthread_cond_signal(&cond);//2.唤醒wait,但是wait要获得mutex锁,所以继续往下执行,直到解锁。 printf("thread2:唤醒wait %d \n",__LINE__); count=count+1; printf("thread2:count+1=%d, %d \n",count, __LINE__); pthread_mutex_unlock(&mutex);//3.解锁,以便thread1中的wait获得锁 printf("thread2:解锁 %d \n",count, __LINE__);}int main(void){ pthread_t t_a; pthread_t t_b; pthread_create(&t_a,NULL,thread1_decrement_count,(void *)NULL);/*创建进程t_a*/ pthread_create(&t_b,NULL,thread2_increment_count,(void *)NULL); /*创建进程t_b*/ pthread_join(t_a, NULL);/*等待进程t_a结束*/ pthread_join(t_b, NULL);/*等待进程t_b结束*/ pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); exit(0);}
- linux 多线程-条件变量
- Linux多线程 |互斥锁|条件变量
- Linux多线程编程-条件变量
- linux 多线程(条件变量)
- linux 多线程【2】条件变量
- linux多线程编程---条件变量
- linux多线程之条件变量
- linux 多线程(条件变量)
- Linux多线程编程-条件变量
- Linux多线程—条件变量
- Linux多线程编程---条件变量
- 【Linux多线程同步】条件变量
- linux多线程之条件变量
- linux多线程之条件变量
- linux多线程-----条件变量、pthread_cond_xxx
- Linux--多线程条件变量使用
- Linux编程练习 --多线程4--条件变量
- Linux多线程编程下的条件变量
- XAMPP Error: MySQL shutdown unexpectedly. 解决方法
- LInux下帮助文件转HTML
- linux 的dd命令
- Linux和UNIX的最大的区别
- Java和PHP在Web开发方面的比较
- linux 多线程-条件变量
- java泛型
- PB在计算列中获取上一行数据
- VC 6.0 面向对象的俄罗斯方块尝试(部分注释)
- 好习惯,不能丢
- struts2.3.x 用validation框架作客户端验证
- 谈 自动事件 和 手工事件 的区别
- Cannot open keyboard?
- 关于函数由绝对路径转为相对路径