gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:36:49 27 4
gpt4 key购买 nike

场景一:释放互斥量然后等待场景二:WAITING然后释放互斥量

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

最佳答案

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

场景 2,等待然后释放互斥量,是​​任何现实世界实现必须在内部工作的方式,因为不存在必要行为的原子实现。但是从应用程序的角度来看,如果不释放互斥锁,则无法观察到线程是阻塞集的一部分,因此在“抽象机器”的意义上,它是原子的。

编辑:更详细地说,条件变量等待的实际实现通常如下所示:

  1. 修改条件变量对象的一些内部状态,使得调用者被认为是它的阻塞集的一部分。
  2. 解锁互斥锁。
  3. 执行阻塞等待操作,如果步骤 1 中的条件变量对象的状态由于来自任何其他线程的信号而发生变化,它将立即返回的特殊属性。

因此,“阻塞”行为分为两个步骤,其中一个发生在互斥体解锁之前(获得阻塞集中的成员资格),另一个发生在互斥体解锁之后(可能休眠和让出)控制给其他线程)。正是这种拆分能够使抽象机中的“条件等待”操作成为“原子”操作。

关于c - 如果 pthread_cond_wait 不是原子的会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13884820/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com