如果两个程序同时访问共享内存,一个写入其中,另一个程序从中读取,共享内存是否会被破坏?
我有两个程序,一个将从服务器和Web获取一些数据,并将解析后的数据保存到共享内存中,我有一个读取程序,它将读取到最后保存的数据集。
例如,如果第一个程序从100个服务器收集数据并且当前在第101个服务器中,那么读取器程序将读取第100个服务器之前的所有数据。一旦第101次完成,读者程序将读取第101个数据集。 这里服务器的数据集可能有多个数据,如磁盘空间,负载等。 那么这种访问会破坏共享内存中的数据吗?或者我的方式可以吗?
答案 0 :(得分:4)
你有没有理由用流程而不是线程来做这件事?从同步的角度来看,这可能会让你的生活更加艰难。
如果您正在处理线程,我会告诉您使用信号量保护您的访问,这样您就可以保证读者不会读取作者正在编写的相同数据集;我相信信号量和其他同步原语的实现也存在于进程间共享内存中,但这种情况不太常见。
您绝对应该使用其他人的同步原语的原因是,在现代硬件上,写入可以重新排序或延迟,例如第一个程序是“当前在第101个服务器”,但实际上,第100个服务器的数据写入尚未从CPU写回。信号量或互斥量将包括适当的内存防护指令以刷新写入,以便内存与其他线程/进程看起来一致;你绝对应该使用其他人精心编写的实现,而不是编写自己的同步逻辑。
此外,在测试时,在多处理器计算机上进行测试非常重要,因为进程之间的竞争条件不太可能出现在单处理器盒上。
答案 1 :(得分:4)
您所描述的实际上是并发中常见的计算问题,称为 Readers-writers
如果在其他程序写入内存时尝试从内存中读取内容,则很可能会损坏数据。您应该使用同步原语之一(锁,信号量,监视器......)来确保这种情况永远不会发生。
我建议你看一下The Little Book of Semaphores,特别是章节 4.2读者 - 作家问题。