2

我使用 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))使用原子操作吗?

供将来参考:易失性:多线程编程几乎没用

4

3 回答 3

1

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

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

于 2011-01-12T12:19:16.843 回答
1

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

于 2011-01-12T12:23:52.327 回答
-1

不需要 volatile 和 atomic 访问。没有它们,使用 mmap 的 IPC 可以正常工作。

如果您需要通知是否有更改,您可以使用消息队列,但您也可以使用它们来代替 mmap(取决于您要发送的消息有多大。 mmap 工作得好是数据大,但 MQ 是小于 200k)

于 2011-01-12T14:35:32.070 回答