如果pthread_cond_wait不是原子的,会发生什么?

时间:2012-12-14 19:09:10

标签: c

场景1:释放互斥然后等待 场景2:等待然后释放互斥锁

试图从概念上理解它的作用。

1 个答案:

答案 0 :(得分:4)

如果在调用线程被视为条件变量“阻塞”之前释放了互斥锁,则另一个线程可以锁定互斥锁,更改谓词所基于的状态,并调用pthread_cond_signal 没有等待线程醒来(因为它还没有被阻止)。这就是问题所在。

场景2,等待然后释放互斥锁,在内部是如何实现任何实际的实现,因为没有必要行为的原子实现。但是从应用程序的角度来看,如果没有互斥体被释放,就没有办法观察线程是阻塞集的一部分,所以在“抽象机器”的意义上,它是原子的。

编辑:要详细了解,条件变量等待的实际实现通常如下所示:

  1. 修改条件变量对象的某些内部状态,以便将调用者视为其阻塞集的一部分。
  2. 解锁互斥锁。
  3. 使用特殊属性执行阻塞等待操作,如果来自步骤1的条件变量对象的状态由于来自任何其他线程的信号而发生更改,它将立即返回。
  4. 因此,“阻塞”的行为分为两个步骤,其中一个步骤发生在互斥锁解锁之前(获得被阻止集合中的成员资格),另一个步骤发生在互斥锁解锁后(可能是睡眠和屈服)控制到其他线程)。正是这种分裂能够使抽象机器中的“条件等待”操作成为“原子”。