5

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

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

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

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

4

1 回答 1

3

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

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

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

于 2013-06-17T18:15:53.680 回答