我使用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++;
问题是:
volatile int Data
)吗?__sync_fetch_and_add(&(shared->Data), 1)
)使用原子操作吗?供将来参考:Volatile: Almost Useless for Multi-Threaded Programming。
答案 0 :(得分:1)
无法保证volatile
能够在多个处理器之间正常工作,您需要检查的是该内在函数是否在操作期间插入了适当的内存屏障。
这是某种信号量吗?如果是这样,你最好使用这种结构的平台实现。
答案 1 :(得分:1)
从多个线程更改整数时,不应使用volatile。挥发性既不是必需的也不是充分的。原子操作就可以了。
答案 2 :(得分:-1)
无需进行易失性和原子访问。使用mmap的IPC在没有它们的情况下工作正常。
如果您需要通知是否有更改,可以使用message queues,但您也可以使用它们而不是mmap(取决于您要发送的邮件有多大.mmap运行良好是数据很大,但MQ小于200k)