我想插入简单的内存屏障,即 C# Thread.MemoryBarrier();
的模拟。
我如何在 C++ 上执行此操作? :
这是我要修改的代码:
volatile uint32_t curWriteNum;
void ObtainAndCommit(T* val) {
memcpy(&storage[curWriteNum & MASK], val, sizeof(T));
// Ensure storage is written before mask is incremented
// insert memory barrier
++curWriteNum;
}
更新
当我发布这个问题时,我只是想知道如何插入内存屏障。但现在我们似乎在讨论如何使我的程序有效,所以我添加了指向类的完整列表的链接 one reader / one writer no-memory-allocation lock-free ring-buffer .
最佳答案
增量应该具有释放语义,以便所有先前写入的效果不会在增量之后重新排序。
只需声明curWriteNum
作为std::atomic<int>
.递增 std::atomic<int>
具有释放语义。事实上,它有 memory_order_seq_cst
语义,比 release 强。更准确地说,您需要 curWriteNum.fetch_add(1, std::memory_order_release)
.
在读者端,您应该将值读为 int n = curWriteNum;
,或者更准确地说,int n = curWriteNum.load(std::memory_order_acquire);
.
参见 std::memory_order更多细节。此外,深度视频 C++ and Beyond 2012: Herb Sutter - atomic<> Weapons, 1 of 2 .
关于c++11 如何插入简单的内存屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166073/