为了简单起见并专注于我的问题的核心,让我们假设一个内存位置,由指针变量 ptr
在本地寻址,在多个进程之间共享。我特别使用 C/++ 中的 MPI 共享内存窗口来分配和共享内存。具体来说,假设 ptr
引用了一个浮点变量,所以在本地我们有
float* ptr;
现在假设所有进程都试图将相同的值const float f
写入ptr,即
*ptr = f;
我的问题是:考虑到所有进程都试图以相同的方式修改字节,即考虑到 f
已经每个进程的值相同。因此,我的问题归结为:对于并发写入操作,例如浮点变量,是否存在竞争条件导致字节模式不一致的可能性,尽管每个进程都试图以相同的方式修改内存。 IE。如果我确定每个进程都写入相同的数据,那么我可以省略同步吗?
最佳答案
是的,你必须同步共享内存。修改线程驻留在不同进程这一事实没有任何意义,它仍然是数据竞争(从不同线程写入共享内存)。
请注意,同步对象还解决了其他问题,例如可见性和内存重新排序,写入共享内存的内容无关紧要。
目前,该标准没有定义进程(只有线程)的概念,也没有提供任何在进程之间轻松同步的方法。
你分配一个std::mutex
在共享内存中并将其用作同步原语,或依赖 win32 进程间同步原语,如互斥锁、信号量或事件。
或者,如果你只想同步一个原语,你可以分配一个std::atomic<T>
在共享内存上并将其用作同步原语。
关于c++ - 特定共享内存写入操作 (MPI) 的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43560744/