我有多个进程在使用boost共享内存。写入器进程将写入共享内存中的数组,如下所示:
void push(int32_t val_)
{
int nextIndex = _currentIndex.fetch_add(1,std::memory_order_relaxed);
_buffer[nextIndex] = val_;
}
//val_ is guaranteed to be >=1
//_buffer is an array of int32_t in shared memory initialized to 0
单个读卡器进程将如下所示:
void process()
{
int idx=0;
while(running)
{
int32_t val = _buffer[idx];
if(val)
{
//do some work...
++idx;
}
}
}
根据boost的说法:“该地址范围中的更改会自动被映射了相同共享内存对象的其他进程看到。”
我的问题是,假设_buffer正确对齐,_buffer可以简单地作为int32_t的数组吗?还是绝对有必要将_buffer定义为std::atomic的数组?在x86上,写入int32_t是原子的,假设对齐是正确的,boost保证其他进程将看到更新。
CPU信息:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 1
Core(s) per socket: 12
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Stepping: 2
CPU MHz: 2596.945
BogoMIPS: 5193.42
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 30720K
NUMA node0 CPU(s): 0-5,12-17
NUMA node1 CPU(s): 6-11,18-23
发布于 2018-07-24 03:29:23
正如您自己编写的那样,一个线程将写入某个内存位置:
_buffer[nextIndex] = val_;
而另一个线程读取该内存位置:
int32_t val = _buffer[idx];
根据标准,该内存地址必须同步,否则它将是未定义的行为。
该数组必须是原子数组、由互斥锁或快速自旋锁保护的简单数组,或者其读写同步的任何其他数组。
https://stackoverflow.com/questions/51485885
复制相似问题