【发布时间】:2012-12-14 19:09:09
【问题描述】:
场景 1:释放互斥体然后等待 场景2:等待然后释放互斥体
试图从概念上理解它的作用。
【问题讨论】:
标签: c
场景 1:释放互斥体然后等待 场景2:等待然后释放互斥体
试图从概念上理解它的作用。
【问题讨论】:
标签: c
如果互斥锁在调用线程在条件变量上被认为“阻塞”之前被释放,那么另一个线程可以锁定互斥锁,更改谓词所基于的状态,然后调用pthread_cond_signal 无需 一直在等待的线程被唤醒(因为它还没有被阻塞)。这就是问题所在。
场景 2,等待然后释放互斥体,是任何现实世界实现必须在内部工作的方式,因为没有必要行为的原子实现。但是从应用程序的角度来看,如果不释放互斥锁,就无法观察到线程是阻塞集的一部分,因此在“抽象机器”的意义上,它是原子的。
编辑:更详细地说,条件变量等待的实际实现通常如下所示:
因此,“阻塞”行为分为两个步骤,其中一个发生在互斥锁解锁之前(获得阻塞集中的成员资格),另一个发生在互斥锁解锁之后(可能是休眠和让步)控制到其他线程)。正是这种拆分能够使抽象机器中的“条件等待”操作“原子化”。
【讨论】: