pthread_cond_broadcast用处

以前学习POSIX THREAD时就不太理解broadcast在什么场景下使用比较合适。因为broadcast的语义是唤醒所有被阻塞的线程。

当时的想法是,在系统析构时调用它比较有效,唤醒阻塞的线程,回收线程资源,然后退出系统。

 

今天在做 lock_server 时,才了解到broadcast的用处,它的效果是,减少系统中条件变量的个数

 

需求

系统中有很多锁,锁有FREE和LOCKED两种状态。不同的client会申请自己需要的锁,server响应client的申请。假如client申请的锁已被占用,那么client应该阻塞,等待锁被释放。

设计1 

client阻塞在它需要的那个锁上,应该是pthread_cond_wait(&lockid, &mutex)

这样设计的话,对于每一个锁,都需要一个对应的条件变量,这样设计增加了系统的复杂性

设计2 应用broadcast

系统中设置一个共享的条件变量 cond,所有的线程阻塞在cond上

	while(lock_status_[lid] == LOCKED) {
		pthread_cond_wait(&c_, &m_);
	}	
        pthread_cond_broadcast(&c_);    

这样,一旦某个锁被释放,所有的阻塞线程都会被唤醒,但唯有阻塞在这个锁的线程才能真正被唤醒。

另外,mutex的使用,保证了最多一个线程被真正唤醒,即便是broadcast。

 

转载于:https://www.cnblogs.com/zhouzhuo/p/3781511.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值