C++11 如何插入简单的内存屏障



我想插入简单的内存屏障,即 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。

最新更新