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就可以解决这个问题。
答案 0 :(得分:2)
简短的回答:他们不能。这对于语言的可移植性是必要的,因为C ++不希望每个平台都需要对特定数据集大小的无锁支持。使用std::atomic<T>
可以使库轻松地为某些T
透明地提供无锁原子性,并为其他人使用锁定。
好的一面是,在代码库中用T
替换atomic<T>
可提供准确用于同步的对象的文档,并提供对这些对象的意外非原子访问的保护。
长答案:reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value)
实际上可能会在月亮的正确阶段对某些实现起作用,但这是最纯粹的邪恶。