条件变量解惑

34 篇文章 2 订阅
条件变量是用来等待而不是用来上锁的,通常条件变量和互斥锁同时使用。
条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。
条件的检测是在互斥锁的保护下进行的(也就是先获得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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值