条件变量

条件变量


使用互斥锁来实现线程间数据的共享和通信, 明显的缺点是它只有两个状态: 锁定与非锁定. 而条件变量通过允许线程阻塞 和 等待 另一个线程发送信号的方法弥补了互斥锁的不足, 它常和互斥锁一起使用. 使用时, 条件变量被用来阻塞一个线程, 当条件不满足时, 线程往往解开相应的互斥锁并等待条件发生变化. 一旦其它的某个线程改变了条件变量, 它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程. 这些线程将重新锁定互斥锁并重新测试条件是否满足. 一般的, 条件变量被用来进行线程间的同步.
条件变量的结构为pthread_cond_t, 函数pthread_cond_init()被用来初始化一个条件变量.它的原型为: extern int pthread_cond_init __P (( pthread_cond_t * __cond, __const pthread_condattr_t * __cond_attr));
其中cond是一个指向结构体pthread_cond_t的指针, cond_attr是一个指向结构pthread_condattr_t的指针. 结构pthread_condattr_t是条件变量的属性结构, 和互斥锁一样可以用它来设置条件变量是进程用不这是进程间可用, 默认值是PTHREAD_PROCESS_PRIVATE, 即变量在同一进程内的各个线程使用. 注意初始化条件变量只有未被使用时才能重新初始化或被释放. 释放一个条件变量的函数为pthread_cond_destroy( pthread_cond_t cond)
函数pthread_cond_wait()使线程阻塞在一个条件变量上. 它的函数原型为: extern int pthread_cond_wait __P(( pthread_cond_t *__cond, pthread_mutex_t * __mutex));
线程解开mutex指向的锁并被条件变量cond阻塞. 线程可以被函数pthread_cond_signal和函数pthread_cond_broadcast唤醒, 但是要注意的是, 条件变量只是起阻塞和唤醒线程的作用, 具体的判断条件还需要用户给出. 
另一个用来阻塞线程的函数是pthread_cond_timewait(), 它的原型为: extern int pthread_cond_timewait __P(( pthread_cond_t * __cond, pthread_mutex_t * __mutex, __const struct timespec * __abstime));
它比函数pthread_cond_wait()多了一个时间参数, 经历abstime段时间后, 即使条件变量不满足, 阻塞也被解除.
函数pthread_cond_signal()原型为: extern int pthread_cond_signal __P(( pthread_cond_t * __cond));
它用来释放被阻塞在条伯变量cond上的一个线程. 多个线程阻塞在此条件变量上时, 哪一个线程被唤醒是曲线程的调度策略所决定的. 要注意的是, 必须保护条件变量的互斥锁来保护这个函数, 否则条件满足信号又可能在测试和调用pthread_cond_wait函数之间被发出, 从而千万了无限的等待. 
简单的例子: 
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
usigned count;
decrement_count()
{
pthread_mutex_lock( & count_lock);
while(count==0)pthread_cond_wait( &count_nonzero, &count_lock);
count = count -1;
pthread_mutex_unlock( & count_lock);
}


increment_count()
{
pthread_mutex_lock(&count_lock);
if( count == 0)pthread_cond_signal( & count_nonzero);
count = count +1;
pthread_mutex_unlock( &count_lock);
}
count值为0时, decrement函数在pthread_cond_wait处被阻塞, 并打开互斥锁count_lock. 此时, 当调用到函数increment_count时, phread_cond_signal()函数改变条件变量, 告知decrement_count()停止阻塞.
函数pthread_cond_broadcast( pthread_cond_t * cond)用来唤醒所有被阻塞在条件变量cond上的线程. 这些线程被唤醒后将再次竞争相应的互斥锁, 所以必须小心使用这个函数.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值