linux条件变量
2016-07-12 16:53
381 查看
条件变量是线程可用的另一种同步机制。条件变量与互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。
条件本身是由互斥量保护的。线程在改变条件状态之前必须首先锁住互斥量。其他线程在获得互斥量之前不会察觉到这种改变,因为互斥量必须在锁定以后才能计算条件。
初始化及销毁:
等待条件变量:
传递给pthread_cond_wait的互斥量对条件进行保护。调用者把锁住的互斥量传给该函数,函数然后自动把调用线程放到等待条件的线程列表上,对互斥量解锁。
pthread_cond_wait返回时,互斥量再次被锁住。
条件变量通知:
一个demo:
条件本身是由互斥量保护的。线程在改变条件状态之前必须首先锁住互斥量。其他线程在获得互斥量之前不会察觉到这种改变,因为互斥量必须在锁定以后才能计算条件。
初始化及销毁:
<pre name="code" class="cpp">int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
int pthread_cond_destroy(pthread_cond_t *cond);
等待条件变量:
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex); int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t mytex,const struct timespec *abstime);
传递给pthread_cond_wait的互斥量对条件进行保护。调用者把锁住的互斥量传给该函数,函数然后自动把调用线程放到等待条件的线程列表上,对互斥量解锁。
pthread_cond_wait返回时,互斥量再次被锁住。
条件变量通知:
int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond);
一个demo:
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/ void *thread1(void *); void *thread2(void *); int i=1; int main(void) { pthread_t t_a; pthread_t t_b; pthread_create(&t_a,NULL,thread2,(void *)NULL);/*创建进程t_a*/ pthread_create(&t_b,NULL,thread1,(void *)NULL); /*创建进程t_b*/ pthread_join(t_b, NULL);/*等待进程t_b结束*/ pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); exit(0); } void *thread1(void *junk) { for(i=1;i<=9;i++) { pthread_mutex_lock(&mutex);/*锁住互斥量*/ if(i%3==0) pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/ else printf("thread1 i=%d\n",i); pthread_mutex_unlock(&mutex);/*解锁互斥量*/ sleep(1); } } void *thread2(void *junk) { while(i<9) { pthread_mutex_lock(&mutex); pthread_cond_wait(&cond,&mutex);/*等待*/ printf("thread2 i=%d\n",i); pthread_mutex_unlock(&mutex); sleep(1); } }
相关文章推荐
- C++中自定义sleep、条件变量sleep实例
- Linux线程管理必备:解析互斥量与条件变量的详解
- 基于条件变量的消息队列 说明介绍
- 信号量 互斥锁 条件变量的区别
- 线程 ,生产者. 消费者 互斥锁,条件变量
- 为什么pthread_cond_wait需要互斥锁为参数
- 线程、互斥锁与条件变量实例理解
- 条件变量(condition)
- 利用POSIX互斥锁和条件变量实现的信号量
- pthread_mutex_lock用法
- 进程间的通信(互斥锁、条件变量、读写锁、文件锁、信号灯)
- C++封装互斥量和条件变量
- Posix多线程笔记(五)-----条件变量
- 线程间同步机制----条件变量
- 解读条件变量
- 根据Linux 线程挂起与唤醒原理,实现Sleep的暂停与继续
- 基于线程池的线程调度管控系统
- 用Condition条件变量实现生产者消费者模式
- 互斥锁与条件变量的配合! (关于互斥锁和条件变量分析的比较透彻)
- 再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)