IPC通过mmap的文件:应该使用原子和/或volatile吗?

时间:2011-01-12 12:06:29

标签: c++ ipc atomic volatile mmap

我使用mmap的文件在进程之间共享数据。

代码是这样的:

struct Shared
{
int Data;
};

int file = open("file.dat", O_RDWR);
Shared* shared = static_cast<Shared*>(
    mmap(0, sizeof(Shared), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, file, 0));
shared->Data++;

问题是:

  1. 我应该使用volatile限定符(volatile int Data)吗?
  2. 我应该对共享数据(__sync_fetch_and_add(&(shared->Data), 1))使用原子操作吗?

  3. 供将来参考:Volatile: Almost Useless for Multi-Threaded Programming

3 个答案:

答案 0 :(得分:1)

无法保证volatile能够在多个处理器之间正常工作,您需要检查的是该内在函数是否在操作期间插入了适当的内存屏障。

这是某种信号量吗?如果是这样,你最好使用这种结构的平台实现。

答案 1 :(得分:1)

从多个线程更改整数时,不应使用volatile。挥发性既不是必需的也不是充分的。原子操作就可以了。

答案 2 :(得分:-1)

无需进行易失性和原子访问。使用mmap的IPC在没有它们的情况下工作正常。

如果您需要通知是否有更改,可以使用message queues,但您也可以使用它们而不是mmap(取决于您要发送的邮件有多大.mmap运行良好是数据很大,但MQ小于200k)