C ++获取/发布排序

时间:2014-01-21 14:43:26

标签: c++ memory atomic lock-free

假设我有一个从值2开始的计数器,一些非原子布尔变量和4个线程。

//Initialization (happens before any thread execute).
std::atomic<int> count = ATOMIC_VAR_INIT(2);
bool someBoolean = false;

主题1:

count.fetch_sub(1, std::memory_order_release);

主题2:

someBoolean = true;
count.fetch_sub(1, std::memory_order_release);

主题3:

while(count.load(std::memory_order_acquire) != 0);
//Now, we're out of the while loop...
assert(someBoolean);

主题4:

while(std::atomic_thread_fence(std::memory_order_acquire), 
      count.load(std::memory_order_relaxed) != 0);
//Now, we're out of the while loop...
assert(someBoolean);

线程3或线程4的断言是否可能触发?

1 个答案:

答案 0 :(得分:3)

线程4可能会触发断言,因为您使用load操作和内存栅栏的顺序不正确。您必须首先load count变量,然后放置内存获取围栏 在一般情况下,您必须在发布同步标志之前放置一个发布栏 ,然后在之后放置一个获取栏

您可以在Jeff Preshing的博客中找到有关获取/释放内存栅栏的详细说明和示例: http://preshing.com/20130922/acquire-and-release-fences/

线程3(以及修复函数调用顺序后的线程4)不会触发断言,因为线程之间的同步关系是正确建立的。