LINUX之条件变量
这已经是我第二次折腾条件变量了,第一次看了半天资料,愣是没搞懂。
这次又是参考别人博客,又是看unix高级环境变程,又是看了一节电子科技大学教学视频才算搞懂。
先总结几个点:
1.条件变量是为了让多个线程满足某种执行顺序应运而生的,如公交车司机开车系统,售票员系统,售票员关门->司机开车->司机停车->售票员开门.
2.调用pthread_cond_wait(&cond,&lock)首先会给lock解锁,当满足cond条件时,会给lock再次上锁,这里需要注意,会先解锁,再上锁。
3.pthread_cond_signal(&cond)只通知一个等待条件变量的线程,而pthread_cond_broadcast(&cond)通知所有等待条件变量的线程。
4.条件变量同锁一起使用使得线程可以以一种无竞争的方式等待任意条件的发生。所谓无竞争就是,条件改变这个信号会发送到所有等待这个信号的线程。而不是说一个线程接受到这个消息而其它线程就接收不到了。
也就是所有线程都可以接收到,并执行。
5.在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开pthread_cond_wait()之前,
mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应
上代码:
#include <stdio.h> #include <pthread.h> pthread_mutex_t lock; pthread_cond_t cond; int count; void* consumer(void* arg) { pthread_mutex_lock(&lock); printf("consumer\n"); pthread_cond_wait(&cond,&lock); printf("consumer get\n"); pthread_mutex_unlock(&lock); } void* consumer1(void* arg) { pthread_mutex_lock(&lock); printf("consumer1\n"); pthread_cond_wait(&cond,&lock); printf("consumer1 get\n"); pthread_mutex_unlock(&lock); } void* producer(void* arg) { pthread_mutex_lock(&lock); printf("producer\n"); pthread_mutex_unlock(&lock); pthread_cond_broadcast(&cond); //通知所有等待条件变量的线程 //pthread_cond_signal(&cond); //只通知一个等待条件变量的线程 } int main(void) { pthread_t thid1,thid2,thid3; count=0; pthread_mutex_init(&lock,NULL); pthread_cond_init(&cond,NULL); pthread_create(&thid1,NULL,consumer,NULL); pthread_create(&thid2,NULL,consumer1,NULL); sleep(1); pthread_create(&thid3,NULL,producer,NULL); pthread_join(thid1,NULL); pthread_join(thid2,NULL); pthread_join(thid3,NULL); pthread_cond_destroy(&cond); pthread_mutex_destroy(&lock); return 0; }