我发现C++11互斥锁不是void lock() volatile。编译器如何知道哪些函数是内存屏障,哪些不是?是否所有的函数都有障碍,即使它们不是易失性的?有哪些不太为人所知的记忆障碍和每个人都应该知道的记忆障碍?
发布于 2012-07-29 21:58:01
运行时库必须以某种方式实现互斥锁,以便编译器知道!语言标准并没有说明如何做到这一点。
很可能,它涉及到对某些操作系统服务的调用,而这些服务充当了内存屏障。或者编译器可以有一个扩展名,比如void _ReadWriteBarrier();
发布于 2012-07-29 22:19:50
您的锁的实际实现将是这样的:编译器不会执行非法的重新排序,不会省略变量加载,并且它将确保以原子方式访问std::mutex变量,并且CPU执行必要的内存屏障以获取和释放锁。
需要做多少工作才能确保这一点的细节因平台而异,但您的库实现将做正确的事情。
https://stackoverflow.com/questions/11709736
复制相似问题