首页 > 解决方案 > 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 的《线程无法实现为库》呢?

标签: multithreadingc++11compiler-constructionmutexmemory-barriers

解决方案


POSIX 函数pthread_mutex_lockpthread_mutex_unlock内存屏障,编译器和/或 CPU 无法重新排序加载和存储在它们周围。否则互斥锁将毫无用处。那篇文章可能是不准确的。

请参阅POSIX 4.12 内存同步

应用程序应确保多个控制线程(线程或进程)对任何内存位置的访问受到限制,这样任何控制线程都不能读取或修改内存位置,而另一个控制线程可能正在修改它。使用同步线程执行以及相对于其他线程同步内存的函数来限制此类访问。以下函数相对于其他线程同步内存:[参见网站上的列表]


推荐阅读