【发布时间】:2019-11-08 22:32:38
【问题描述】:
这个问题是关于 C++ 中的独立栅栏
为了尝试封装获取和释放栅栏的使用,我编写了以下代码:
#include <thread>
#include <atomic>
#include <cassert>
class sync {
std::atomic<bool> flag{false};
public:
void release()
{
std::atomic_thread_fence(std::memory_order_release);
flag.store(true, std::memory_order_relaxed);
}
bool acquire()
{
return flag.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire); // Is this acquire fence observed by the application ?
}
};
int main()
{
sync s;
int data = 0;
std::thread t1{[&] { data = 12; s.release(); }};
std::thread t2{[&] { if (s.acquire()) assert(data==12); }};
t1.join(); t2.join();
}
我相信栅栏的位置正确(在存储之前“释放”,在加载之后“获取”)。
我不确定加载/获取是否真的有效。
由于获取栅栏是在加载/返回语句之后,我想知道它是否被考虑在内。
这种获取栅栏的使用是否正确?
【问题讨论】:
-
我想你误解了栅栏的使用。相关:stackoverflow.com/a/56398731/5376789
-
@xskxzr 我根据来自this article..的信息将栅栏放在那里。
标签: c++ multithreading c++11 atomic