pthread_mutex_lock是否具有happens-before语义?

Does pthread_mutex_lock have happens-before semantics

本文关键字:happens-before 语义 是否 mutex lock pthread      更新时间:2023-10-16

threadA遍历这段代码

{
    global_a = 100;  // 1
    {
        pthread_mutex_lock(&b_mutex)
                ...
        pthread_mutex_unlock(&b_mutex)
    }  // 2
}

threadB执行这个代码片段

{
    {
        pthread_mutex_lock(&b_mutex)
                ...
        pthread_mutex_unlock(&b_mutex)
    }  // 3
    int tmp = global_a; // 4
}

,假设从观察者的角度来看,执行序列确实是

  1. threadA—1
  2. threadA—2
  3. threadB—3
  4. threadB—4

线程b "int tmp = global_a;"上的代码可以看到线程a在"global_a = 100;"上设置的代码吗?

pthread_mutex_lock不阻止之前的指令在其之后排序。

类似地,pthread_mutex_unlock不阻止按照指令在其之前排序。

但:

  1. In threadA global_a = 100 happens-before pthread_mutex_unlock(&b_mutex) .

  2. 在threadB中pthread_mutex_lock(&b_mutex) 发生在 int tmp = global_a; .

如果你观察

  • pthread_mutex_unlock(&b_mutex)在线程a 发生在 pthread_mutex_lock(&b_mutex)在线程b之前。
  • (换句话说,threadB在 threadA释放锁后获得锁),然后

    global_a = 100;在threadA 发生在 int tmp = global_a;在threadB之前。所以,最后一个看到第一个的效果。

    POSIX标准规定:

    至于POSIX标准中的同步细节,我找到的唯一参考文献(其他人也参考了)是关于内存同步的一小章。它说pthread_mutex_lock(和其他一些函数)

    相对于其他线程同步内存

    有人将其解释为全内存屏障保证,其他人(和我)更愿意考虑一些经典的保证,当锁定和等待操作提供内存获取语义时,解锁和通知操作- 内存释放语义。请看,例如,这封邮件。

    在POSIX中没有happens-before项。但它可以像往常一样定义,考虑到内存顺序保证(在一个人的解释中)。

    如果你能保证执行顺序-当是。如果可以保证执行顺序,那么在某些体系结构上甚至不需要锁。

    Lock实际上做了三件事:1. 不要允许不同的代码同时执行。看到的。这里没有提到记忆。它只是保证不同线程中的代码不会同时执行。2. 在某些架构上,它会插入缓存一致性指令。这迫使多个处理器系统将数据刷新到实际内存中。但你不需要担心这种情况因为现在"如果对同一内存位置的所有写操作都按一定顺序执行,那么多处理器就是缓存一致的"3.它插入内存屏障指令。这是为处理器,告诉它不要打乱执行顺序。

    你的编译器也可能会把东西弄坏。将变量声明为volatile。

    相关文章: