分类:
2008-12-09 19:00:11
Chapter 11 exercises
|
Which sequence of steps is correct?
or
|
答案:这两个实现都正确,取决于不同的环境,各有优缺点:
第一个,在我们发送signal的时候,我们还持有mutex,这样被唤醒的thread在从wait中醒来的时候会尝试去给mutex加锁(这是pthread_cond_wait的定义),但是他们不可能获得锁,因为所还没有释放,因此他们又进入了加锁睡眠。等我们释放掉锁之后他们才继续执行。所以说,有点浪费CPU
第二个,在我们发送signal之前,就已经将锁释放了,当然现在外部的条件已经变化了,只不过我们还没有去通知某人去处理它。但由于此时的锁已经释放了,所以有可能在我们发送signal之前,由另一个人跑过来加了锁,然后将资源处理了,然后放开了锁跑掉了(或者还没有放开锁)。此时,我们再次调用signal去通知原本要通知的人,于是该人醒来,就尝试去加锁,如果中间哪个人已经将锁释放掉了,那么加锁成功,取处理资源,却发现资源已被中间哪个人处理掉了。所以没事干了,放掉锁,休息去吧。所以,当我们从睡梦中醒来的时候,一定要重新检查条件是否满足,如果不满足,就不要做什么。因为在我们睡眠的过程中,我们没有锁,所以不知道外界发生了什么。
当然,如果中间哪个人并没有及时将锁释放,等原本要通知的人被唤醒的时候,尝试加锁,也是加不上的,他就依然会block,直到中间哪个家伙处理完事情,放掉锁。接下来同上面一样了就。