pthread_mutex_lock是否具有happens-before语义?
Does pthread_mutex_lock have happens-before semantics
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
}
,假设从观察者的角度来看,执行序列确实是
- threadA—1
- threadA—2 threadB—3
- threadB—4
线程b "int tmp = global_a;"
上的代码可以看到线程a在"global_a = 100;"
上设置的代码吗?
pthread_mutex_lock
不阻止之前的指令在其之后排序。
类似地,pthread_mutex_unlock
不阻止按照指令在其之前排序。
但:
-
In threadA
global_a = 100
happens-beforepthread_mutex_unlock(&b_mutex)
. -
在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。
- Arduino无法编译名为SP:"Expected ')' before '(' token"的变量
- 为什么我的功能在使用 goto 时会给我带来"expected primary-expression before '}' token"?
- 如何修复此错误"expected primary expression before 'int'"?
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- 使用结构和数组时的"expected primary expression before '.' token"
- 如何解决"Expected expression before " = " token"?
- 错误:创建模板类时"expected unqualified-id before '{' token"
- AWS Lambda C++ 开发工具包"Process exited before completing request"
- 为什么包含标头会导致"use of auto before deduction of auto"错误?
- 为什么我总是"error: expected unqualified-id before 'case'"?
- 外部"C"导致错误"expected '(' before string constant"
- 如何解决"expected constructor, destructor, or type conversion before ‘(’ token"错误?
- 这个编译器错误是什么意思 - "qualified-id in declaration before ‘=’ token" C++?
- 即使我没有 #define 任何东西或错过分号,如何修复"expected unqualfied-id before string constant"?
- C++ RVO: when it happens?
- "[Error] expected unqualified-Id before 'if'"这个代码块是什么意思
- memory_order_seq_cst操作的"happens before"关系和"precedes in a single total order"关系有什么区别?
- 获取链表上的"expected ‘)’ before ‘&’ token"到 BST 构造函数签名
- 为什么 ISO/IEC 14882:2011 中定义了明显的"inter-thread happens before"关系?
- pthread_mutex_lock是否具有happens-before语义?