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

Eug*_*sky 5 c++ compare-and-swap c++11

InterlockedCompareExchange在 Windows 中,以及__sync_val_compare_and_swap在 gcc 中,都采用指针,因此我可以将任何地址(例如指向共享内存块的地址)传递到这些函数中。

对于非 x86 架构,我可能必须确保内存对齐以确保正确性,而对于 x86(也许还有其他架构),我可能希望确保缓存行对齐以提高性能,尽管正确性不应该成为问题(-> x86 前缀LOCK) 。

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

有没有办法在 C++11 的原子函数中使用任意指针?看起来简单的std::atomic 转换并不能解决这个问题。

Cas*_*sey 3

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

从好的方面来说,在代码库中替换Tatomic<T>可以提供有关用于同步的对象的准确文档,并提供针对这些对象的意外非原子访问的保护。

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