10

我看到 C++11 互斥锁不是void lock() volatile. 编译器如何知道哪些函数是内存屏障,哪些不是?即使它们不是易失性的,所有功能都是障碍吗?有哪些鲜为人知的记忆屏障和大家应该知道的记忆屏障?

4

2 回答 2

5

运行时库必须以编译器知道的方式实现互斥锁!语言标准没有说明如何做到这一点。

很可能,它涉及对某些用作内存屏障的操作系统服务的调用。或者编译器可以有一个扩展,比如void _ReadWriteBarrier();

于 2012-07-29T13:58:00.740 回答
5

您的实际实现std::mutex将使得编译器不会执行非法重新排序,不会忽略变量加载,它将确保锁变量被原子访问,并且 CPU 执行必要的内存屏障以获取和释放锁.

需要做多少工作以确保这因平台而异,但您的库实现将做正确的事情。

于 2012-07-29T14:19:50.033 回答