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