在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方能被再次唤醒。

从这里看,使用的效率是比较低的,如果再多线程环境中,这种情况频繁发生的话,是一件比较痛苦的事情。
所以觉得,如果程序不关心线程可预知的调度行为,那么最好在锁定区域以外调用他们吧:-)
如果读者喜欢英文的话,可以参考:
http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_cond_broadcast.html

这里罗嗦几句,对于

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_signal与pthread_cond_broadcast的使用说明相关推荐

  1. pthread_cond_signal与pthread_cond_broadcast的使用区别

    简言之: pthread_cond_t cond; pthread_cond_broadcast(&cond)可以唤醒多个跟条件变量cond绑定的锁 一个生产者多消费者,生产者能一次产生多个产 ...

  2. PulseAudio多线程通信:pthread_cond_broadcast/pthread_cond_signal/pthread_cond_wait(九)

    pthread_cond_broadcast() pthread_cond_signal() pthread_cond_wait()函数用法概述1.pthread_cond_wait() 用于阻塞当前 ...

  3. 条件变量pthread_cond_wait()和pthread_cond_signal()详解

    条件变量          条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立&qu ...

  4. 深入理解pthread_cond_wait、pthread_cond_signal

    ===============================man pthread_cond_wait的解释========================== LINUX环境下多线程编程肯定会遇到 ...

  5. pthread_cond_wait pthread_cond_broadcast

    通常,和pthread _cond_wait 配对使用的有pthread_cond_signal , 同时还有用于pthread_cond_t初始化的pthread_cond_init,销毁的pthr ...

  6. 线程同步之条件变量:pthread_cond_signal和pthread_cond_wait

    在多线程编程下,常常出现A线程要等待B线程条件完成后再继续进行,这里等待方式有两种: 1.使用锁+轮询 使用这种方法可以很简单的实现,但是会有一定的性能消耗,其还有一个点要好好把握,就是一次轮询没有结 ...

  7. pthread_cond_wait和pthread_cond_signal函数详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/YEYUANGEN/article/de ...

  8. 轻松理解pthread_cond_wait和pthread_cond_signal的使用

    原文:https://blog.csdn.net/yeyuangen/article/details/37593533 LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthre ...

  9. linux线程间同步(1)互斥锁与条件变量

    线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量以及读写锁. 互斥锁(mutex) 互斥锁,是一种信 ...

最新文章

  1. 微信小程序 --- 拨打电话
  2. python【Matlibplot绘图库】Animation动画(真の能看懂~!)
  3. cb-A10系统优化之(一):去除自启动软件
  4. MySQL5.5读写分离之mysql-proxy
  5. RabbitMq学习笔记006---修改RabbitMq端口号和心跳时间
  6. vm15安装MACOS
  7. 实力分享,聚焦分布式高可用消息队列
  8. 【转载】谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
  9. 陈越c语言自学攻略,C语言自学攻略——陈越姥姥
  10. python hog特征提取,直接从原始图像的HoG特征提取编辑图像的HoG特征
  11. 导图解文 从梦想到财富(05)世界第八大奇迹,知者赚不知者被赚
  12. HTML页面背景图片平铺
  13. python指纹识别_Python实现指纹识别你见过没?
  14. Mybatis-----实验小结
  15. 火柴棍能组成的最大数字
  16. 【经验分享】突然我的SM.MS的图床没法访问了(内附解决方法)
  17. 柳州汇商大湾区双招双引 谋定·大健康医药:李喜贵被聘顾问
  18. 加速应用开发 | Firebase Summit 2021 精彩回顾
  19. 一首同音叠字诗“石室诗士施氏”
  20. MySQL导入mdx_浅谈MDX数据库

热门文章

  1. 完美解决 Could not detect Mac OS X Version from sw_vers output: '10.12.3
  2. 从源码深入接触ThreadX(2) --- 选择一个API
  3. java一个byte字节可以存2个16进制字符
  4. 计算机组成原理-组成篇(上)
  5. 可以500%提高开发效率的前端UI框架!QUI!
  6. 嵌入式linux mplayer,QT调用mplayer 的方法
  7. 区块链如何改变我们的支付方式
  8. 魔兽世界虚拟机 不能登录(魔兽世界无法登陆解决方法)
  9. actix websocket消息处理流程源码剖析
  10. 第九轮回 没有卵用的寻求帮助