从共享内存同时读取是不是安全?

Posted

技术标签:

【中文标题】从共享内存同时读取是不是安全?【英文标题】:Is it safe to concurrently read from shared memory?从共享内存同时读取是否安全? 【发布时间】:2017-07-12 09:33:19 【问题描述】:

我正在跨多个进程共享一些内存(使用shm_open 创建,我使用mmap 映射不同的“区域”)。我正在使用命名信号量来同步对该内存的访问。

我在该内存中有一个只读区域(它已由创建共享内存对象的进程设置)。我还需要使用互斥锁来让进程读取该区域吗?如果可以同时读取该区域,我可以删除命名信号量并共享未命名信号量。

问题与here 的问题类似,但可能 OP 不够清楚。

【问题讨论】:

只要在任何只读访问之前设置共享内存并且在初始化之后从未更改,您就可以安全地进行并发读取。 另见“单写者,多读者”模式。例如,Synchronization for multiple readers, single writer?、How to make a multiple-read/single-write lock from more basic synchronization primitives? 和 Lock free multiple readers single writer。 Mutex locking when shared memory is only read的可能重复 【参考方案1】:

根据多个来源,读取相同的内存似乎不会引入竞争条件,因此可以在没有锁定的情况下完成。我有几个系统从几个月开始运行,一个进程写入(使用全局锁),另外两个进程不断读取相同的共享内存,我从来没有遇到过问题。

【讨论】:

如果我有一个进程写入共享内存,而其他进程从该内存读取,我是否需要在写入时锁定内存,还是原子操作? 对你的两个问题都没有:你不需要锁定内存,它不是原子操作。 为什么我不需要锁定?如果我不锁定,而且它不是原子的,当另一个进程正在写入时,一个进程可以读取,不是吗? 在上述情况下,一个进程写入共享内存之前共享它。如果您需要并发写入,则需要锁,但问题都是关于并发读取。

以上是关于从共享内存同时读取是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

Linux中多个进程使用文件指针读取文件时是不是使用共享虚拟内存?

无法从另一个孩子读取一个孩子写入的共享内存

Servlet编程专题5之servlet线程安全问题

pthread 从共享内存中读取

linux 共享内存 可不可以不加锁呢? 系统有两个进程,一个负责写入,一个负责读取

访问共享内存时出现分段错误