c++ - 特定共享内存写入操作 (MPI) 的同步

标签 c++ mpi shared-memory race-condition atomic

为了简单起见并专注于我的问题的核心,让我们假设一个内存位置,由指针变量 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/

相关文章:

c++ - 如何在C++结构初始化中获取成员

c++ - GetDlgItemInt 返回 0

c++ - 模板函数在编译期间被报告为 "undefined reference"

c++ - MPI,更大的阵列

c - 尝试安装 openmpi 时出现段错误

c++ - 共享内存 POSIX 将值赋给字符串

java - synchronized(new Object()) 的用例

c++ - 在 C++ 中重载 "+"orerator 时 that.vect.push_back(0) 和 that.vect.begin() 出错

c++ - 可以在 Internet 上而不是在 LAN 集群内分发 MPI (C++) 程序吗?

c - 使用插入排序并行排序链表