跨线程共享内存访问

Posted

技术标签:

【中文标题】跨线程共享内存访问【英文标题】:Shared Memory Access Across threads 【发布时间】:2016-03-15 20:30:37 【问题描述】:

共享内存在多​​线程中使用时是否需要同步。以下是场景。

    使用 Int Array 类型创建的共享内存(在进程 Pa 中)。 Pa 的每个线程都有一个指向该数组的索引,并将更新数组[索引] 基于某些条件。 我们是否需要 Mutex 来同步 Int 数组访问? 假设还有一个进程 (Pb) 尝试访问此 Int 数组。我需要 互斥锁(用于线程)和信号量用于进程同步。

让我知道相同的 cmets。

【问题讨论】:

【参考方案1】:

如果数组包含纯值类型,并且每个线程都在数组的不相交子集上运行 - 这就是说 每个线程都有一组互斥的索引,它将被读取/写入或来自 - 那么不,您不需要任何同步。

数组本身只是一块内存。重要的是,没有两个线程会尝试在未受保护的情况下读取或写入相同的内存位置 - 它们可以愉快地读取和写入交错或相邻或任何其他不相交的位置,因为它们不会互相踩到脚趾,所以说话。

但是,如果多个线程需要读取或写入数组中的相同索引,那么您绝对需要使用某种类型的同步来保护这些读取和写入。例如,假设您有:

int ia[10];

还有两个线程。如果你可以保证(通过任何方式)线程#1 只会访问ia[0..4],线程#2 只会访问ia[5..9],那么你很好。但是,如果他们都想在任何地方读取或写入,则您需要一些东西来保护这些访问。

【讨论】:

取决于 OP 所说的共享内存是什么意思。真正的 Posix 共享内存的读写操作都是原子的。 @SergeyA 这当然是一个实现细节——我认为 C 不能保证这一点,不是吗?还是我错过了什么?

以上是关于跨线程共享内存访问的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 跨所有 php 线程访问全局变量

进程间通信:共享内存与线程对象访问

IPC共享内存和线程内存的性能差异

跨 docker 容器的共享内存

提出一个用于原子访问共享内存的包装器

Java内存模型