进程同步,条件变量,pthread_cond_wait,pthread_cond_init,PTHREAD_COND_INITIALIZER

条件量同互斥锁一样也是进程同步的一种机制,互斥锁是用来加锁,而条件量则是用来等待,主要包括两个动作,一是线程等待“满足条件成立”而挂起,二是线程满足“成立条件”而被唤醒,由于是多线程,为了防止竞争,所以条件量一般和锁一起使用。

创建互斥量cond:

pthread_cond_t cond = PTHREAD_COND_INITIALIZER

还可以通过函数的方式创建:

int pthread_cond_init(pthread_cond_t *cond,NULL);

注意:两种方式创建有所区别,第一种是创建静态全局的,所创建的量在全局区,第二种创建的量在栈,两种的区别我们可以理解为全局变量和局部变量的差异,对于两种方式,如果创建的是全局的条件量则用第一种方式初始化,如果是在函数内部创建则用第二种方式。这里其实跟互斥锁一样,互斥锁也可以用这两种方式初始化,原理相同。

注销互斥量:

int pthread_cond_destroy(pthread_cond_t *cond);

注意:只有在没有线程使用该互斥量的时候才能销毁,否则会返回EBUSY。


等待:

当线程不满足给定条件时,让线程挂起,挂起分为两种,一种是无限制的等待,pthread_cond_wait;一种是定时等待,pthread_cond_timedwait。无论是哪种等待都必须和锁配合使用,防止多个线程同时使用互斥量。

注意两个函数

pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,const struct timespec *time);


唤醒:

当线程满足某个条件时,可以唤醒被挂起的线程,唤醒有两个函数

一是唤醒等待该互斥量的线程:

pthread_cond_signal(pthread_cond_t *cond);

二是唤醒所有等待线程:

pthread_cond_broadcast(pthread_cond_t *cond);


现在可以通过下面的一个简单实例加深理解:


void st_tpool_clean(void *mutex)
{
	pthread_mutex_t *mutex = (pthread_mutex_t *)mutex;
	pthread_mutex_unlock(mutex);

}//end st_tpool_clean

void st_tpool_waitTask(pthread_mutex_t *mutex,pthread_cond_t *cond)
{
	pthread_cleanup_push(st_tpool_clean,mutex);
	pthread_mutex_lock(mutex);
	pthread_cond_wait(cond,mutex);
	pthread_mutex_unlock(mutex);
	pthread_cleanup_pop(0);
			

对代码的理解可以结合我的上一篇文章,关于pthread_cleanup_push/pthread_cleanup_pop,可以加深理解。




  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值