首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在这种情况下,我是否需要在共享内存中使用原子类型?

在这种情况下,我是否需要在共享内存中使用原子类型?
EN

Stack Overflow用户
提问于 2018-07-24 03:23:11
回答 1查看 612关注 0票数 3

我有多个进程在使用boost共享内存。写入器进程将写入共享内存中的数组,如下所示:

代码语言:javascript
复制
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

单个读卡器进程将如下所示:

代码语言:javascript
复制
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信息:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2018-07-24 03:29:23

正如您自己编写的那样,一个线程将写入某个内存位置:

代码语言:javascript
复制
_buffer[nextIndex] = val_;

而另一个线程读取该内存位置:

代码语言:javascript
复制
  int32_t val = _buffer[idx];

根据标准,该内存地址必须同步,否则它将是未定义的行为。

该数组必须是原子数组、由互斥锁或快速自旋锁保护的简单数组,或者其读写同步的任何其他数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51485885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档