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

时间:2013-06-11 05:12:49

标签: c++ c++11 compare-and-swap

Windows中的

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

对于非x86体系结构,我可能必须确保内存对齐以确保正确性,对于x86(以及其他可能),我可能希望确保缓存行对齐性能,尽管正确性不应成为问题(> ; x86 LOCK前缀)。

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

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

1 个答案:

答案 0 :(得分:2)

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

好的一面是,在代码库中用T替换atomic<T>可提供准确用于同步的对象的文档,并提供对这些对象的意外非原子访问的保护。

长答案:reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value)实际上可能会在月亮的正确阶段对某些实现起作用,但这是最纯粹的邪恶。