我想为在 Linux 嵌入式系统上运行的服务(守护程序)使用的少数参数添加网络控制。不需要过程调用,每个参数都可以以非常自然的方式轮询。共享内存似乎是一种很好的方式,可以将网络代码排除在守护进程之外,并将共享访问限制为一组精心控制的变量。
由于我不希望部分写入导致从未写入的值的可见性,因此我正在考虑使用std::atomic<bool>
and std::atomic<int>
。但是,我担心它std::atomic<T>
可能以仅适用于 C++11 线程而不适用于多个进程的方式实现(可能甚至不适用于 OS 线程)。具体来说,如果实现使用存储在共享内存块之外的任何数据结构,在多进程场景中,这将失败。
我确实看到了一些要求,这些要求std::atomic
不包含嵌入式锁对象或指向其他数据的指针:
原子积分特化和特化
atomic<bool>
应有标准布局。它们每个都应该有一个普通的默认构造函数和一个普通的析构函数。它们都应支持聚合初始化语法。原子类模板应该有指针部分特化。这些特化应具有标准布局、平凡的默认构造函数和平凡的析构函数。它们都应支持聚合初始化语法。
在我看来,微不足道的默认构造和破坏似乎排除了关联的每个对象数据,无论是存储在对象内部、通过指针成员变量还是通过外部映射。
但是,我没有看到任何排除使用单个全局互斥锁/关键部分(甚至是全局集合,只要集合元素不与单个原子对象相关联——类似于缓存关联方案的内容)的实现可用于减少错误冲突)。显然,在使用全局互斥锁的实现上,来自多个进程的访问会失败,因为用户将拥有独立的互斥锁,并且实际上并不彼此同步。
是否atomic<T>
允许执行与进程间共享内存不兼容的事情,或者是否有其他规则使其安全?
我刚刚注意到微不足道的默认构造使对象处于未就绪状态,atomic_init
因此需要调用。标准提到了锁的初始化。如果这些存储在对象内部(并且动态内存分配似乎是不可能的,因为析构函数仍然微不足道),那么它们将在进程之间共享。但我仍然担心全局互斥锁的可能性。
无论如何,保证对atomic_init
共享区域中的每个变量进行一次调用似乎很困难……所以我想我必须避开 C++11 原子类型。