由于我不希望部分写入导致未曾写入的值可见,因此我考虑使用
std::atomic<bool>
和std::atomic<int>
。但是,我担心std::atomic<T>
可能只能与C++11线程一起使用,而不能与多个进程(甚至OS线程)一起使用。具体来说,如果实现使用位于共享内存块之外的任何数据结构,在多进程场景下,这将失败。我确实看到了一些要求,表明
std::atomic
不会持有嵌入式锁对象或指向其他数据的指针:
对我来说,平凡的默认构造和析构似乎排除了相关的每个对象数据,无论是存储在对象内部、通过指针成员变量还是通过外部映射。原子整数特化和特化
atomic<bool>
应具有标准布局。它们必须分别具有平凡的默认构造函数和平凡的析构函数。它们必须支持聚合初始化语法。原子类模板应有指针部分特化。这些特化应具有标准布局,平凡的默认构造函数和平凡的析构函数。它们必须支持聚合初始化语法。
但是,我没有看到任何可以排除实现使用单个全局互斥锁/临界区(甚至全局集合)的规则,只要集合元素不与单个原子对象相关联--类似于缓存关联方案可用于减少虚假冲突。显然,如果一个实现使用全局互斥锁,那么从多个进程访问将失败,因为用户会拥有独立的互斥锁,并且不会真正地相互同步。
atomic<T>
的实现是否允许执行与进程间共享内存不兼容的操作,或者是否有其他规则使其安全?
我刚刚注意到,平凡的默认构造将对象保留在未准备就绪的状态,并且需要调用
atomic_init
。标准还提到了锁的初始化。如果这些存储在对象内部(动态内存分配似乎不可能,因为析构函数仍然是平凡的),则它们将在进程之间共享。但是我仍然担心全局互斥锁的可能性。无论如何,在共享区域中为每个变量保证单个调用
atomic_init
似乎很困难...所以我想我必须远离C++11原子类型。
std::atomic
,或其他API是否保证工作。 - Ben Voigtstd::atomic<T>
的部分原因是它提供了一个很好的接口,您不需要记住获取和释放锁定。在那个符合规范的C++程序中,它将执行必要的操作使变量访问具有原子性。但由于标准没有涉及进程间问题,std::atomic
使用的同步机制可能无法跨进程工作。 - Andre Kostur