条件变量解惑
来源:互联网 发布:2016年数据分析大赛 编辑:程序博客网 时间:2024/05/05 00:08
条件变量是用来等待而不是用来上锁的,通常条件变量和互斥锁同时使用。
条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。
条件的检测是在互斥锁的保护下进行的(也就是先获得mutex),如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。
那么在另外的线程发出条件改变的信号之后呢?
如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。
条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。
条件的检测是在互斥锁的保护下进行的(也就是先获得mutex),如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。
那么在另外的线程发出条件改变的信号之后呢?
如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。
(被唤醒的线程从原来的位置继续执行,也就是在wait函数那里继续执行,wait会再获得这个mutex)
#include <stdio.h>#include <pthread.h>pthread_mutex_t mutex;pthread_cond_t cond;void *thread1(void *arg) {pthread_cleanup_push(pthread_mutex_unlock, &mutex);//提供函数回调保护while (1) {printf("thread1 is running\n");pthread_mutex_lock(&mutex);pthread_cond_wait(&cond, &mutex);printf("thread1 applied the condition\n");pthread_mutex_unlock(&mutex);sleep(4);}pthread_cleanup_pop(0);}void *thread2(void *arg) {while (1) {printf("thread2 is running\n");pthread_mutex_lock(&mutex);pthread_cond_wait(&cond, &mutex);printf("thread2 applied the condition\n");pthread_mutex_unlock(&mutex);sleep(1);}}int main() {pthread_t thid1, thid2;printf("condition variable study!\n");pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond, NULL);pthread_create(&thid1, NULL, (void *) thread1, NULL);pthread_create(&thid2, NULL, (void *) thread2, NULL);do {pthread_cond_signal(&cond);} while (1);sleep(20);pthread_exit(0);return 0;}
参考:http://www.cnblogs.com/feisky/archive/2010/03/08/1680950.html
0 0
- 条件变量解惑
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 条件变量
- 黑马程序员——java_交通灯管理系统
- App校园图片
- Android SQLite的查询优化(二)
- 常用UI颜色收集
- 用SCSS需要小心IE对css的几个限制
- 条件变量解惑
- Android SQLite的查询优化(三)
- java学习之线程笔记
- 修改Linux 控制台终端个数
- 记录一下Spring+Quertz的过程
- Linux配置YUM本地源
- 黑马程序员——java_银行业务调度系统
- Android -- jar包混淆
- 九度OJ 1283 第一个只出现一次的字符