条件变量解惑

来源:互联网 发布:2016年数据分析大赛 编辑:程序博客网 时间:2024/05/05 00:08
条件变量是用来等待而不是用来上锁的,通常条件变量和互斥锁同时使用。
条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。
条件的检测是在互斥锁的保护下进行的(也就是先获得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
原创粉丝点击