pthread_cond_wait与pthread_cond_signal简单笔记

前些日子很忙,昨天把手上的工作做的差不多后,就花了点时间充充电。

线程同步,临界区之类的就不讲了,那是比较简单的线程互斥方式,用的比较多,所以感觉也没什么好讲的,注意好不要死锁就行。cond用的比较少,本以为也很简单,看了下后,发现其需要一个互斥量,所以大概看了下实现,还是有些东西需要注意下的,所以在这儿简单的记录下笔记。

知乎上也有一个问题在讨论,为什么cond需要附加一个mutex才能使用。cond最主要的用途,是在使用互斥量使用共享变量的时候进行等待,等待某个条件触发后,唤醒并进行之后的流程。重点在于在等待的时候,已经使用了互斥量获取了共享变量的所有权,即只有在等待的这个线程拥有所有权,其余线程无法使用该共享变量。

然后在唤醒之后,依旧拥有该互斥量,并且独享共享变量的所有权。然而,在signal或者broadcast前,需要获得该互斥量,然而这样不就获取不到了么?

wait函数帮我们做了2件事情,保证在wait线程中在我们mutex的lock与unlock之间,依旧拥有该mutex,我们也只需要在我们操作共享变量的代码前后,调用lock与unlock即可。在wait调用后,该线程休眠之后,会自动unlock互斥量,这样其余的线程就可以signal将本线程唤醒,唤醒后wait会自动对mutex lock,这样在我们调用方来看,其实没有额外的一次unlock和lock。

然而在实践中,假设使用了broadcast,假设有多个线程wait,唤醒的一刻只有一个线程可以lock特定的mutex,unlock后,其余的wait会依次唤醒,所以执行后续流程的时候,可能需要对操作的共享变量进行一次判断,假设只需要操作1次,3个worker,假如有一个worker已经被唤醒了,那么其余worker应该不会执行。

对于wait线程,逻辑为

lock mutex
wait cond
unlock mutex

对于signal线程,则
lock mutex
if cond then signal end
unlock mutex

共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day