c++ - 编译器跨互斥边界重新排序代码

标签 c++ locking mutex

考虑以下代码:

int a = 0, b = 0;
boost::mutex m;
a++;
m.lock();
m.unlock();
b++;

锁的作用是告诉编译器“好吧,暂时忘掉 C++ 标准,我不在乎如果你严格遵守它会允许什么样的优化。你不能对任何内存访问重新排序越过这个界限”。这是否意味着 a++; 总是发生在 b++; 之前?或者这是否意味着,如果在锁之间有一个语句 s,不要用 a++b++ 重新排序?

最佳答案

Baum mit Augen 的评论已经很好地回答了这个问题。

但是,如果“a”和“b”是全局变量,并且声明为volatile,根据编译器的不同,互斥量强加的内存屏障可能保证读取/write 表达式不会跨边界重新排序。

这意味着读取“b”并发现它已增加的线程,在此之后执行类似的互斥锁定以施加内存屏障,最后读取“a”,保证发现“a”已增加也修改了。

MSVC 有这种行为,其他一些编译器也有。

关于c++ - 编译器跨互斥边界重新排序代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40884758/

相关文章:

c# - 使用不受管理的C++ dll的C#Web服务有IIS错误

c# - 我应该使用不同的对象来锁定每个属性吗?

locking - 为什么我们需要一个java锁来读取?

c++ - 在释放互斥锁之前或之后通知消费者线程?

c - pthread_mutex_lock() 处的段错误

c++ - 在 C++11 中声明接口(interface)的最佳方法

c++ - 无法获得 Boost Spirit 语法以使用 std::map<> 的已知键

'//' 和 '///' 之间的 C++ 区别

c# - .NET Framework 中的并发 HashSet<T>?

multithreading - Linux 中的 pthread_mutex_lock 和内核 mutex_lock 有什么区别?