我想插入简单的内存屏障,即 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;
}
更新
当我发布这个问题时,我只是想知道如何插入内存屏障。但现在似乎我们讨论如何使我的程序有效,所以我添加了指向类一个读取器/一个写入器无内存分配无锁环形缓冲区的完整列表的链接。
应具有发布语义,以便所有先前写入的效果不会在增量之后重新排序。
只需将curWriteNum
声明为 std::atomic<int>
即可。递增std::atomic<int>
具有发布语义。事实上,它有memory_order_seq_cst
语义,比释放更强。更准确地说,您需要 curWriteNum.fetch_add(1, std::memory_order_release)
.
在读取器端,您应该将值读取为int n = curWriteNum;
,或者更准确地说,int n = curWriteNum.load(std::memory_order_acquire);
。
有关更多详细信息,请参阅 std::memory_order。此外,深度视频C++和超越2012:赫伯萨特 - 原子<>武器,1 of 2。