加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux的多线程编程的高效开发经验

发布时间:2016-05-31 02:32:00 所属栏目:Linux 来源:网络整理
导读:简介:本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验, 用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱。在本文中,我们穿 插一些 Windo

注意 Linux 平台上触发条件变量的自动复位问题

条件变量的置位和复位有两种常用模型:第一种模型是当条件变量置位 (signaled)以后,如果当前没有线程在等待,其状态会保持为置位(signaled ),直到有等待的线程进入被触发,其状态才会变为复位(unsignaled),这种 模型的采用以 Windows 平台上的 Auto-set Event 为代表。其状态变化如图 1 所示:

图 1. Windows 的条件变量状态变化流程

Linux的多线程编程的高效开发经验

通过对比结果,你会发现同样的逻辑,在 Linux 平台上运行的结果却完全是 两样。对于在 Windows 平台上的模型一, Jack 开着出租车到了站台,触发条 件变量。如果没顾客,条件变量将维持触发状态,也就是说 Jack 停下车在那里 等着。直到 Susan 小姐来了站台,执行等待条件来找出租车。 Susan 搭上 Jack 的出租车离开,同时条件变量被自动复位。

但是到了 Linux 平台,问题就来了,Jack 到了站台一看没人,触发的条件 变量被直接复位,于是 Jack 排在等待队列里面。来迟一秒的 Susan 小姐到了 站台却看不到在那里等待的 Jack,只能等待,直到 Mike 开车赶到,重新触发 条件变量,Susan 才上了 Mike 的车。这对于在排队系统前面的 Jack 是不公平 的,而问题症结是在于 Linux 平台上条件变量触发的自动复位引起的一个 Bug 。

条件变量在 Linux 平台上的这种模型很难说好坏。但是在实际开发中,我们 可以对代码稍加改进就可以避免这种差异的发生。由于这种差异只发生在触发没 有被线程等待在条件变量的时刻,因此我们只需要掌握好触发的时机即可。最简 单的做法是增加一个计数器记录等待线程的个数,在决定触发条件变量前检查下 该变量即可。改进后 Linux 函数如清单 5 所示。

清单 5. Linux 出租车案例代码实例

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读