InterlockedCompareExchange
在 Windows 中,以及 __sync_val_compare_and_swap
在 gcc 中采用指针,因此我可以传入任何地址,例如指向这些函数的共享内存块。
对于非 x86 架构,我可能必须确保内存对齐以确保正确性,对于 x86(可能还有其他),我可能希望确保缓存行对齐以提高性能,尽管正确性应该不是问题 (-> x86 LOCK
前缀)。
为了摆脱我的代码中一些平台相关的东西(Windows VC++ 与 GCC),我查看了 C++11 的 atomic_compare_exchange_weak
。和 friend 。但它们都对 std::atomic<T>*
类型的变量起作用.
有没有办法在 C++11 的原子函数中使用任意指针?它看起来不像一个简单的 cast to std::atomic会解决这个问题。
最佳答案
简短的回答:他们不能。这对于语言的可移植性是必要的,因为 C++ 不希望要求每个平台都对一组特定的数据大小提供无锁支持。使用 std::atomic<T>
使库可以轻松地为某些 T
透明地提供无锁原子性s 并为其他人使用锁。
好的一面是,替换 T
与 atomic<T>
在您的代码库中提供了关于哪些对象用于同步的确切文档,并提供了对这些对象的意外非原子访问的保护。
长答案:reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value)
可能实际上在月相的正确阶段对某些实现起作用,但它是最纯粹的邪恶。
关于c++ - std::atomic_compare_exchange_* 等如何与任意指针一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17036883/