【问题标题】:IPC via mmap'ed file: should atomics and/or volatile be used?通过 mmap 文件的 IPC:应该使用 atomics 和/或 volatile 吗?
【发布时间】:2011-06-07 19:17:07
【问题描述】:

我使用 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(&amp;(shared-&gt;Data), 1)) 使用原子操作吗?

供日后参考:Volatile: Almost Useless for Multi-Threaded Programming

【问题讨论】:

    标签: c++ ipc atomic volatile mmap


    【解决方案1】:

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

    【讨论】:

    • 线程与进程无关(IPC代表进程间通信)。
    • @VJo:嗯?一个进程至少是一个线程。需要详细说明吗?
    • 是的,它至少是一个线程,但是原子操作与进程有什么关系呢?对于 mmap 数据,您不需要任何特殊的东西来访问它。
    • @VJo:老兄,你看问题了吗?数据在进程之间共享。
    【解决方案2】:

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

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

    【讨论】:

    • 这不是信号量,而是共享计数器。也就是说,一段有意义的数据可以被多个进程更改。
    【解决方案3】:

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

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

    【讨论】:

    • 这里使用 mmap 的主要原因是为了持久化。我希望数据在运行之间保留在磁盘上,这样我就不必实现任何类型的序列化(如果进程意外终止,也可以确保保存实际数据)。
    • @VladV 在这种情况下,共享内存是要走的路。不是地图
    • 老兄,您似乎对您所谈论的事情一无所知。不使用 mmap() 就不能使用共享内存。事实上,一个进程的所有虚拟内存都是使用 mmap() 映射的。
    • @Maxim 我当然知道,但看起来你不知道。 JFYI : fscked.org/writings/SHM/shm-1.html#ss1.1 我相信你可以在网上找到很好的例子。
    • 您发布的链接没有相关性。我建议您删除此线程中的所有 cmets 以避免进一步的尴尬。
    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2019-04-07
    • 2012-05-09
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多