multithreading - Mutex 保护是否会因注册推广而失败?
问题描述
在一篇关于 c++11 内存顺序的文章中,作者展示了一个示例推理“threads lib will not work in c++03”
for (...){
...
if (mt) pthread_mutex_lock(...);
x=...x...
if (mt) pthread_mutex_unlock(...);
}
//should not have data-race
//but if "clever" compiler use a technique called
//"register promotion" , code become like this:
r = x;
for (...){
...
if (mt) {
x=r; pthread_mutex_lock(...); r=x;
}
r=...r...
if (mt) {
x=r; pthread_mutex_unlock(...); r=x;
}
x=r;
有3个问题:
1.这个促销只打破c++03中的互斥保护吗?c语言呢?
2.c++03 线程库失效?
3.任何其他促销可能会导致同样的问题?
如果是错误的示例,那么线程库可以工作,那么 Hans Boehm 的《线程无法实现为库》呢?
解决方案
POSIX 函数pthread_mutex_lock
和pthread_mutex_unlock
内存屏障,编译器和/或 CPU 无法重新排序加载和存储在它们周围。否则互斥锁将毫无用处。那篇文章可能是不准确的。
请参阅POSIX 4.12 内存同步:
应用程序应确保多个控制线程(线程或进程)对任何内存位置的访问受到限制,这样任何控制线程都不能读取或修改内存位置,而另一个控制线程可能正在修改它。使用同步线程执行以及相对于其他线程同步内存的函数来限制此类访问。以下函数相对于其他线程同步内存:[参见网站上的列表]
推荐阅读
- google-apps-script - 带有 onEdit Google 表格的用户/电子邮件戳
- python - 从嵌套的 xml 文件创建熊猫数据框时单行重复
- javascript - GraphQL 查询 - 如何在不同类型上重用内联片段字段
- spring - 从另一个 gradle 任务运行 gradle test
- python - 使用 python 的多处理并行化 keras 中的模型预测
- javascript - 如何将这两个数组合并为一个
- flutter - 在 CustomDialog 中捕捉按钮按下
- reactjs - 在 AWS Amplify 上部署 React Web 应用程序时出现 403 ACCESS DENIED 错误
- r - 使用 r-dplyr 将 xmlParse 应用于 R 数据框中的 html 格式单元格时出错
- c++ - 在问题的 DP 实现中出现运行时错误:“将数组划分为 k 组,保持最大和最小”