使用共享内存读数据不加锁有问题吗?

如题

你如果保证对共享内存的所有操作都是“读”的话,不加锁没问题。

按我的理解,你的数据放在共享内存中。写的时候加锁了,现在不知道读的时候是否也需要加锁?

让我们来想像一下。数据很大,读一次要一个小时,在这其间“读进程”可能要经过无数次再调度,被抢占等等。如果不加锁,没有人能保证数据的完整性。

写的时候加锁,为了一次写完。再让其它人使用。
读也一样,加锁为了一次读完,再让其它人更改。

如果你的数据有读有写,无序发生。应该都加锁。

看了你在英文版提的问题。虽然你的进程B只读共享内存,但你的进程A应该是往共享内存里写数据的,所以你还是需要同步它们。

usleep()不是正确的同步方法。你应该使用 mutex + condvar来同步它们。

mutex+condvar只能同步线程吧,进程呢?但是要把我的两个进程合并很困难,同时程序结构要做大改动,有没有别的方法?

进程也可以。把Mutex和Condvar放在共享内存里。怎么放这个问题之前有回答过。

它们同步线程,但没有规定必须是同一进程里的线程啊。:slight_smile:

像nakeyfish说的,只要把它们放在共享内存里,让不同进程里的线程都可以对它们进行操作就可以了。

顺便提一下,在像QNX这样支持线程的操作系统里,“进程”不是一个可执行体。