互斥保护块中的同步模式

时间:2015-05-14 07:53:45

标签: c++ c++11 atomic memory-fences

http://www.boost.org/doc/libs/1_58_0/doc/html/atomic/usage_examples.html

在上面提升示例的“具有双重检查锁定模式的单例”中,是_instance的第二次加载的memory_order_consume和_instance的store的memory_order_release是否必要?我认为scoped_lock已经获取并释放了语义,并且_instance的第一次加载具有同步模式memory_order_consume。

1 个答案:

答案 0 :(得分:0)

假设此处使用的boost基元支持与其std对应项相同的功能,则第二个load不需要memory_order_consume,因为它是有保证的 要根据store/release的获取/发布语义与mutex同步,你是对的。

或许,memory_order_consume的使用是基于load/relaxed可能在mutex/acquire障碍上浮动的错误假设, 但是根据mutex保证这是不可能的,因此memory_order_relaxed完全没问题。

另一方面,store/release是绝对必要的,因为它与不受load/consume保护的第一个mutex同步。