文档章节

关于pthread_cond_signal与pthread_cond_broadcast的使用...

 天下杰论
发布于 2012/10/18 13:38
字数 939
阅读 2802
收藏 1

       在code review中,我会发现很多人喜欢在pthread_mutex_lock()和pthread_mutex_unlock(()之间调用 pthread_cond_signal或者pthread_cond_broadcast函数,从逻辑上来说,这种使用方法是完全正确的。但是在多线程环境中,这种使用方法可能是低效的。posix1标准说,pthread_cond_signal与pthread_cond_broadcast无需考虑调用线程是否是mutex的拥有者,也就是说,可以在lock与unlock以外的区域调用。如果我们对调用行为不关心,那么请在lock区域之外调用吧。这里举个例子:
      
我们假设系统中有线程1和线程2,他们都想获取mutex后处理共享数据,再释放mutex。请看这种序列:
      
1)线程1获取mutex,在进行数据处理的时候,线程2也想获取mutex,但是此时被线程1所占用,线程2进入休眠,等待mutex被释放。
      
2)线程1做完数据处理后,调用pthread_cond_signal()唤醒等待队列中某个线程,在本例中也就是线程2。线程1在调用pthread_mutex_unlock()前,因为系统调度的原因,线程2获取使用CPU的权利,那么它就想要开始处理数据,但是在开始处理之前,mutex必须被获取,很遗憾,线程1正在使用mutex,所以线程2被迫再次进入休眠。
       
3)然后就是线程1执行pthread_mutex_unlock()后,线程2方能被再次唤醒。
       从这里看,使用的效率是比较低的,如果再多线程环境中,这种情况频繁发生的话,是一件比较痛苦的事情。所以觉得,如果程序不关心线程可预知的调度行为,那么最好在锁定区域以外调用他们。

对于
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
,一定要在mutex的锁定区域内使用。
如果要正确的使用pthread_mutex_lock与pthread_mutex_unlock,请参考
pthread_cleanup_push 和pthread_cleanup_pop宏,它能够在线程被cancel的时候正确的释放mutex!

        pthread_cond_wait()  用于阻塞当前线程,等待别的线程使用 pthread_cond_signal() pthread_cond_broadcast来唤醒它  pthread_cond_wait()   必须与pthread_mutex 配套使用。 pthread_cond_wait() 函数一进入wait状态就会自动release mutex。当其他线程通过 pthread_cond_signal() pthread_cond_broadcast ,把该线程唤醒,使 pthread_cond_wait()通过(返回)时,该线程又自动获得该 mutex
        pthread_cond_signal 函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
        使用pthread_cond_signal一般不会有“惊群现象”产生,他最多只给一个线程发信号。假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。但无论如何一个pthread_cond_signal调用最多发信一次。
        但是 pthread_cond_signal 在多处理器上可能同时唤醒多个线程,当你只能让一个线程处理某个任务时,其它被唤醒的线程就需要继续 wait,而且规范要求 pthread_cond_signal 至少唤醒一个pthread_cond_wait上的线程,其实有些实现为了简单在单处理器上也会唤醒多个线程. 
        另外,某些应用,如线程池, pthread_cond_broadcast 唤醒全部线程,但我们通常只需要一部分线程去做执行任务,所以其它的线程需要继续wait.
 
http://apps.hi.baidu.com/share/detail/19786281
 

本文转载自:

共有 人打赏支持
粉丝 54
博文 443
码字总数 23611
作品 0
沈阳
项目经理
转载的关于pthread_cond_wait的文章,写的比较详细

三、Glibc的实现 1、数据结构 / Data structure for conditional variable handling. Thestructure of the attribute type is not exposed on purpose. / typedef union { struct { int loc......

zhegaozhouji
2017/06/19
0
0
【原创】手把手教你Linux下的多线程设计--Linux下多线程编程详解(四)

本文可任意转载,但必须注明作者和出处。 【原创】手把手教你Linux下的多线程设计(四) --Linux下多线程编程详解 原创作者:Frozen_socker(冰棍) E_mail:dlskyfly@163.com 线程同步 首先来...

gaoshouma
2007/07/11
0
0
Condition Variables(条件变量)用法指南

int pthreadcondtimedwait(pthreadcondt *restrict cond, pthreadmutext restrict mutex,const struct timespec restrict abstime); int pthreadcondwait(pthreadcondt *restrict cond, pthr......

技术小美
2017/11/12
0
0
pthread_cond_signal和pthread_cond_wait简介

pthreadcondsignal函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthreadcondsignal也会成功返回。 但使用pthre...

天下杰论
2013/08/08
0
0
linux多线程学习(五)---条件变量

1. 相关函数 #include pthreadcondt cond = PTHREADCONDINITIALIZER; int pthreadcondinit(pthreadcondt cond, pthreadcondattrt condattr); int pthreadcondsignal(pthreadcondt *cond); i......

长平狐
2012/09/03
61
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊redisson的DelayedQueue

序 本文主要研究一下redisson的DelayedQueue maven <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.8.1</version></dependenc......

go4it
13分钟前
1
0
一张图看懂JVM

JVM结构示意图 JVM总体概述 JVM总体上是由类装载子系统(ClassLoader)、运行时数据区、执行引擎、内存回收这四个部分组成。其中我们最为关注的运行时数据区,也就是JVM的内存部分则是由方法...

小致dad
14分钟前
0
0
安全管理标准

安全生产严重等级分类: 故障频次: 风险等级矩阵:

乔老哥
45分钟前
2
0
数据结构“树”的相关微视频

今天在腾讯视频上闲逛,然後发现一个叫“岚人”的用户上传了几段小视频,基本上都在5分钟以内,讲解了关于树的一些结构和算法。零代码,非常适合初学者入门。不过,对于老鸟来说,这也是非常...

Iridium
57分钟前
1
0
10-利用思维导图梳理JavaSE-Java 集合

10-利用思维导图梳理JavaSE-Java 集合 主要内容 1.Collection接口 2.Set接口 2.1.Set接口概述 2.2.HashSet类 2.3.TreeSet类 2.4.SortedSet接口 3.List接口 3.1.List接口概述 3.2.ArrayList类...

飞鱼说编程
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部