原子读/写值的静态断言
有没有办法来检查一个值的读/写(加载/存储)是否是原子?我有专门版本的并发容器,只能使用这些值,我想添加一个静态断言来防止意外误用。原子读/写值的静态断言
对于x86_64上的所有基本类型,这是正确的,但对于所有平台或所有长数据类型可能并非如此。另外,小结构和联合也可能被分配一个原子操作(因为它们只是被编译为使用相同大小的基本复制操作)。
C++ 0x草稿在<原子的标头中有一段宏,它表示没有简单的便携方式来检查它。
29.4无锁属性 [atomics.lockfree]
#define ATOMIC_CHAR_LOCK_FREE implementation-defined
#define ATOMIC_CHAR16_T_LOCK_FREE implementation-defined
#define ATOMIC_CHAR32_T_LOCK_FREE implementation-defined
#define ATOMIC_WCHAR_T_LOCK_FREE implementation-defined
#define ATOMIC_SHORT_LOCK_FREE implementation-defined
#define ATOMIC_INT_LOCK_FREE implementation-defined
#define ATOMIC_LONG_LOCK_FREE implementation-defined
#define ATOMIC_LLONG_LOCK_FREE implementation-defined
的宏表示其中的std ::原子<类型>可以在没有锁定来实现的类型,这意味着它们本身就是原子。
嗯,这是很好的信息。我可能能够从中建立一系列静态断言(但它不是通用的)。 – 2011-04-04 15:32:06
我想技术上说这个标准定义的“原子”操作是无锁的。这实际上可能比我想要的更具限制性。但至少是这样。 – 2011-04-04 15:35:44
您拥有的唯一方法是转储生成的每个函数的程序集,并参考处理器供应商的说明以获取指令的原子性保证。
你很担心,[Sparc不能自动写入32位](http://www.win.tue.nl/~aeb/linux/lk/lk-13.html)。但是我很难设想可以证明原子写入的正确性的断言。 – sarnold 2011-04-04 09:57:30