参考: http://blog.youkuaiyun.com/KataDoc360/article/details/3897957
互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线承间的同步。
件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
首先介绍关键函数
pyhread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
************pthread_cond_wait()的使用方法**********/
pthread_mutex_lock(&mutex); /*lock*/
pthread_cond_wait(&cond, &mutex);/*block-->unlock-->wait() return-->lock*/
pthread_mutex_unlock(&mutex); /*unlock*/
/*****************************************************/
线程首先获得锁,进入条件等待,当条件不成立的时候wait函数首先解锁mutex,然后进入休眠等待信号激活,
当有信号激活时,首先获得互斥锁,然后执行。。。最后释放锁。
参考:http://blog.youkuaiyun.com/zclongembedded/article/details/7323816
#include<sys/types.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/
unsigned count = 0;
void *thread1_decrement_count()
{
pthread_mutex_lock(&mutex);
while(count == 0 )
{
printf("thread1:加锁, count=%d, 开始wait %d \n",count, __LINE__);
pthread_cond_wait(&cond, &mutex);//1.解锁,进入休眠等待信号激活.4.被激活之后首先获得锁
printf("thread1:wait被激活 %d \n", __LINE__);//
}
count = count - 1;
pthread_mutex_unlock(&mutex);//5.解锁
printf("thread1:解锁count=%d, %d \n",count, __LINE__);
}
void *thread2_increment_count()
{
pthread_mutex_lock(&mutex);
printf("thread2:加锁, count=%d, %d \n",count, __LINE__);
if(count==0)
pthread_cond_signal(&cond);//2.唤醒wait,但是wait要获得mutex锁,所以继续往下执行,直到解锁。
printf("thread2:唤醒wait %d \n",__LINE__);
count=count+1;
printf("thread2:count+1=%d, %d \n",count, __LINE__);
pthread_mutex_unlock(&mutex);//3.解锁,以便thread1中的wait获得锁
printf("thread2:解锁 %d \n",count, __LINE__);
}
int main(void)
{
pthread_t t_a;
pthread_t t_b;
pthread_create(&t_a,NULL,thread1_decrement_count,(void *)NULL);/*创建进程t_a*/
pthread_create(&t_b,NULL,thread2_increment_count,(void *)NULL); /*创建进程t_b*/
pthread_join(t_a, NULL);/*等待进程t_a结束*/
pthread_join(t_b, NULL);/*等待进程t_b结束*/
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(0);
}