首页 > 代码库 > 条件变量函数

条件变量函数

 

#include <pthread.h>#include <stdio.h>#include <stdlib.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("thead1:%d/n",i);        pthread_mutex_unlock(&mutex);/*解锁互斥量*/sleep(1);}}void *thread2(void *junk){    while(i<9)    {        pthread_mutex_lock(&mutex);if(i%3!=0)            pthread_cond_wait(&cond,&mutex);/*等待*/        printf("thread2:%d/n",i);        pthread_mutex_unlock(&mutex);sleep(1);}} 

 

 

互斥锁:用来上锁。

条件变量:用来等待,当条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用

pthread_cond_init函数可以用来初始化一个条件变量。他使用变量attr所指定的属性来初始化一个条件变量,如果参数attr为空,那么它将使用缺省的属性来设置所指定的条件变量。

pthread_cond_destroy函数可以用来摧毁所指定的条件变量,同时将会释放所给它分配的资源。调用该函数的进程也并不要求等待在参数所指定的条件变量上。

pthread_cond_timedwait与pthread_cond_wait,区别在于,如果达到或是超过所引用的参数*abstime,它将结束并返回错误ETIME

pthread_cond_wait 自动解锁互斥量(如同执行了 pthread_unlock_mutex),并等待条件变量触发

当调用pthread_cond_signal时一个在相同条件变量上阻塞的线程将被解锁。如果同时有多个线程阻塞,则由调度策略确定接收通知的线程。如果调用pthread_cond_broadcast,则将通知阻塞在这个条件变量上的所有线程。一旦被唤醒,线程仍然会要求互斥锁。如果当前没有线程等待通知,则上面两种调用实际上成为一个空操作。如果参数*cond指向非法地址,则返回值EINVAL

条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。

条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其它线程在获得互斥量之前不会察觉到这种改变,因此必须锁定互斥量以后才能计算条件。

条件变量函数