Linux的多线程编程的高效开发经验
因此我们建议在 Linux 平台上要出发条件变量之前要检查是否有等待的线程 ,只有当有线程在等待时才对条件变量进行触发。 注意条件返回时互斥锁的解锁问题 在 Linux 调用 pthread_cond_wait 进行条件变量等待操作时,我们增加一 个互斥变量参数是必要的,这是为了避免线程间的竞争和饥饿情况。但是当条件 等待返回时候,需要注意的是一定不要遗漏对互斥变量进行解锁。 Linux 平台上的 pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) 函数返回时,互斥锁 mutex 将处于锁定状态。因此 之后如果需要对临界区数据进行重新访问,则没有必要对 mutex 就行重新加锁 。但是,随之而来的问题是,每次条件等待以后需要加入一步手动的解锁操作。 正如前文中乘客等待出租车的 Linux 代码如清单 6 所示: 清单 6. 条件变量返回后的解锁实例
这一点对于熟悉 Windows 平台多线程开发的开发者来说尤为重要。 Windows 上的 SignalObjectAndWait() 函数是常与 Linux 平台上的 pthread_cond_wait() 函数被看作是跨平台编程时的一对等价函数。但是需要注 意的是,两个函数退出时的状态是不一样的。在 Windows 平台上, SignalObjectAndWait(HANDLE a, HANDLE b, …… ) 方法在调用 结束返回时的状态是 a 和 b 都是置位(signaled)状态,在普遍的使用方法中 ,a 经常是一个 Mutex 变量,在这种情况下,当返回时,Mutex a 处于解锁状 态(signaled),Event b 处于置位状态(signaled), 因此,对于 Mutex a 而言,我们不需要考虑解锁的问题。而且,在 SignalObjectAndWait() 之后, 如果需要对临界区数据进行重新访问,都需要调用 WaitForSingleObject() 重 新加锁。这一点刚好与 Linux 下的 pthread_cond_wait() 完全相反。 Linux 对于 Windows 的这一点额外解锁的操作区别很重要,一定得牢记。否 则从 Windows 移植到 Linux 上的条件等待操作一旦忘了结束后的解锁操作,程 序将肯定会发生死锁。 等待的绝对时间问题 超时是多线程编程中一个常见的概念。例如,当你在 Linux 平台下使用 pthread_cond_timedwait() 时就需要指定超时这个参数,以便这个 API 的调用 者最多只被阻塞指定的时间间隔。但是如果你是第一次使用这个 API 时,首先 你需要了解的就是这个 API 当中超时参数的特殊性(就如本节标题所提示的那 样)。我们首先来看一下这个 API 的定义。 pthread_cond_timedwait() 定义 请看清单 7 。 清单 7. pthread_cond_timedwait() 函数定义
参数 abstime 在这里用来表示和超时时间相关的一个参数,但是需要注意的 是它所表示的是一个绝对时间,而不是一个时间间隔数值,只有当系统的当前时 间达到或者超过 abstime 所表示的时间时,才会触发超时事件。这对于拥有 Windows 平台线程开发经验的人来说可能尤为困惑。因为 Windows 平台下所有 的 API 等待参数(如 SignalObjectAndWait,等)都是相对时间, (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |