std::atomic_compare_exchange_* 等如何与任意指针一起使用

How can std::atomic_compare_exchange_* etc. be used with arbitrary pointers?

本文关键字:任意 指针 一起 compare atomic exchange std      更新时间:2023-10-16
Windows 中的

InterlockedCompareExchange,以及 gcc 中的__sync_val_compare_and_swap take 指针,因此我可以传入任何地址,例如指向共享内存块到这些函数中。

对于非 x86 体系结构,我可能必须确保内存对齐以确保正确性,

对于 x86(可能还有其他(,我可能希望确保缓存行对齐以提高性能,尽管正确性应该不是问题(-> x86 LOCK前缀(。

为了摆脱代码中一些依赖于平台的东西(Windows VC++与GCC(,我看了一下C++11的atomic_compare_exchange_weak和朋友。但它们都处理 std::atomic<T>* 类型的变量。

有没有办法使用具有 C++11 原子函数的任意指针?看起来不像是一个简单的std::atomic可以解决这个问题。

简短的回答:他们不能。这对于语言的可移植性是必要的,因为C++不希望要求每个平台都对一组特定的数据大小提供无锁支持。使用 std::atomic<T> 使库可以轻松地为某些T透明地提供无锁原子性,并为其他使用锁。

从好的方面来说,将代码库中的T替换为atomic<T>提供了准确用于同步的对象的文档,并防止意外的非原子访问这些对象。

长答案:reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value)实际上可能在月球的正确阶段进行一些实现,但这是最纯粹的邪恶。