【问题标题】:What would happen if pthread_cond_wait was not atomic?如果 pthread_cond_wait 不是原子的会发生什么?
【发布时间】:2012-12-14 19:09:09
【问题描述】:

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

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

【问题讨论】:

    标签: c


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多