gpt4 book ai didi

c++ - pthread_mutex_lock 是否具有 happens-before 语义

转载 作者:行者123 更新时间:2023-11-28 02:23:20 25 4
gpt4 key购买 nike

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. 线程A --- 1
  2. 线程A --- 2
  3. 线程B --- 3
  4. 线程B --- 4

threadB "int tmp = global_a;" 中的代码能否看到 threadA 在 "global_a = 100;" 中设置了什么?

欢迎提出任何建议。

最佳答案

pthread_mutex_lock 不会阻止previous 指令在它之后排序。

类似地,pthread_mutex_unlock 不会阻止 followed 指令在它之前排序。

但是:

  1. 在线程 A global_a = 100 happens-before pthread_mutex_unlock(&b_mutex)

  2. 在线程 B pthread_mutex_lock(&b_mutex) happens-before int tmp = global_a;

如果你观察

  1. pthread_mutex_unlock(&b_mutex) 在 threadA happens-before pthread_mutex_lock(&b_mutex) 在 threadB。

(换句话说,threadB 在 threadA 释放它之后获取锁),然后

global_a = 100; 在 threadA happens-before int tmp = global_a; 在 threadB 中。所以,最后一个看到第一个的效果。

POSIX 标准的内容:

关于 POSIX 标准中的同步细节,我找到的唯一引用(和其他引用)是关于 Memory Synchronization 的简短章节.它说 pthread_mutex_lock(和其他一些函数)

synchronize memory with respect to other threads

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

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

关于c++ - pthread_mutex_lock 是否具有 happens-before 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31541740/

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