条件变量是利用线程间共享的全局变量进行同步的一种机制,条件变量主要包括两个动作
1:等待使用资源的线程等待条件变量为真时启动;
2:另一个线程在使用完资源后将条件设置为真,
而条件变量的保护一般用互斥锁来保护.
如下例子:
/***************************************************************
File Name: condition3.c
Author:motian
Mail:765885195@qq.com
Created Time: 2016年08月01日 星期一 16时26分36秒
**************************************************************/
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
void *thread1(void *);
void *thread2(void *);
pthread_cond_t cond;
pthread_mutex_t mutex;
int i;
int main(void)
{
pthread_t t1,t2;
pthread_cond_init(&cond,NULL); //初始化条件变量
pthread_mutex_init(&mutex,NULL); //初始化互斥锁
pthread_create(&t1,NULL,thread1,NULL); //创建线程
pthread_create(&t2,NULL,thread2,NULL);
pthread_join(t1,NULL); //等待线程结束
pthread_join(t2,NULL);
pthread_cond_destroy(&cond); //清除条件变量和互斥锁
pthread_mutex_destroy(&mutex);
exit(0);
}
void *thread1(void *arg)
{
for(i=1;i<6;i++)
{
pthread_mutex_lock(&mutex); //给互斥锁加锁
printf("xiyoulinux\n");
if(i==3)
{
pthread_cond_signal(&cond); //发射信号唤醒thread2
}
pthread_mutex_unlock(&mutex); //解锁
sleep(1);
}
}
void *t hread2(void *arg)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex); //先等待thread1解锁,然后等待被信号唤醒
printf("motian\n");
pthread_mutex_unlock(&mutex);
}
输出结果:
xiyoulinux
xiyoulinux
xiyoulinux
motian
xiyoulinux
xiyoulinux
程序开始创建了两个线程:
线程1循环打印;
线程二一开始就被阻塞,等待被唤醒.
当i=3时,即条件变量为真时,满足if条件,到线程1的pthread_cond_signal(&cond),发射信号给线程2的pthread_cond_wait (&cond,&mutex);线程2被激活.
线程2被激活时,并没有立即得到运行 ,因为线程2还在等待mutex锁的释放,所以线程1继续往下走,直到线程1释放mutex锁,线程2才能停止等待,打印语句.结束.