1.条件变量创建 静态创建:pthread_cond_t cond=PTHREAD_COND_INITIALIZER; 动态创建:pthread_cond _t cond; pthread_cond_init(&cond,NULL); 其中的第二个参数NULL表示条件变量的属性,虽然POSIX中定义了条件变量的属性,但在LinuxThread中并没有实现,因此常常忽略。 2.条件等待 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); while(条件1) pthread_cond_wait(&cond,&mutex); 函数操作1; pthread_mutex_unlock(&mutex); 当条件1成立的时候,执行pthread_cond_wait(&cond,&mutex)这一句,开放互斥锁,然后线程被挂起。当条件1不成立的时候,跳过while循环体,执行函数操作1,然后开放互斥锁。 3.条件激发 pthread_mutex_lock(&mutex); 函数操作2; if(条件1不成立) pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); 先执行函数操作2,改变条件状态,使得条件1不成立的时候,执行pthread_cond_signal(&cond)这句话。这句话的意思是激发条件变量cond,使得被挂起的线程被唤醒。 pthread_cond_broadcast(&cond); 这句话也是激发条件变量cond,但是,这句话是激发所有由于cond条件被挂起的线程。而signal的函数则是激发一个由于条件变量cond被挂起的线程。 4.条件变量的销毁 pthread_cond_destroy(&cond); 在linux中,由于条件变量不占用任何资源,所以,这句话除了检查有没有等待条件变量cond的线程外,不做任何操作。
#include <pthread.h> #include <stdio.h> #include <unistd.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int count = 5; //pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //pthread_mutex_lock(&mutex); //while(条件1) // pthread_cond_wait(&cond, &mutex); //函数操作1 //pthread_mutex_unlock(&mutex); //解释:当条件1成立的时候,执行pthread_cond_wait(&cond, &mutex)这一句,开放互斥锁,然后线程被挂起。 // 当条件1不成立的时候,跳过while循环体,执行函数操作1,然后开放互斥锁 // 即无论走哪个分支,都会放开互斥锁 //此线程先启动 void* decrement(void* arg) { while(1) { //条件等待 pthread_mutex_lock(&mutex); while(count <= 0) { printf("count<=0,thread is hanging!\n"); pthread_cond_wait(&cond, &mutex); sleep(1); printf("sleep!\n"); } count -= 1; pthread_mutex_unlock(&mutex); if (count == 9) { printf("count==9,thread1 is over!\n"); return NULL; } } } //条件激发 //pthread_mutex_lock(&mutex); //函数操作2; //if(条件1不成立) // pthread_cond_signal(&cond); // pthread_mutex_unlock(&mutex); //解释:先执行函数操作2,改变条件变量,使得条件1不成立的时候,执行pthread_cond_signal(&cond)这句话的意思是激发条件变量cond,使得被挂起的线程被唤醒。 // pthread_cond_broadcast(&cond); 激发所有由于cond条件而被挂起的线程。而signal的函数则是激发一个由于条件变量cond被挂起的线程 void *increment(void *arg) { sleep(1); while(1) { pthread_mutex_lock(&mutex); count += 1; if(count > 0) { printf("count=%d, change cond state!\n", count); pthread_cond_signal(&cond); } pthread_mutex_unlock(&mutex); if (count == 10) { printf("count=10,thread is over!\n"); return NULL; } } } int main(void) { int i1=1, i2=1; pthread_t id1, id2; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); pthread_create(&id1, NULL, decrement, NULL); pthread_create(&id2, NULL, increment, NULL); i2 = pthread_join(id2, NULL); i1 = pthread_join(id1, NULL); if ( (i2==0) && (i1==0) ) { printf("count=%d, the main thread!\n", count); pthread_cond_destroy(&cond); pthread_mutex_destroy(&mutex); return 0; } return -1; }
原文:http://www.cnblogs.com/i80386/p/5028875.html