如果两个程序同时访问共享内存,一个程序写入共享内存,另一个程序读取共享内存,共享内存是否会损坏?
我有两个程序,一个将从服务器和web获取一些数据,并将解析后的数据保存到共享内存中,我有一个读取程序,它将读取直到最后保存的数据集。
例如,如果第一个程序已经从100个服务器收集了数据,并且当前在第101个服务器中,那么直到第100个服务器的所有数据都将被读取器程序读取。一旦第101个完成,读取器程序将读取第101个数据集。在这里,来自服务器的数据集可能有多个数据,如磁盘空间、负载等。那么这种访问会破坏共享内存中的数据吗?或者我这样做还行吗?
发布于 2012-02-27 18:35:09
您所描述的实际上是并发性中的一个常见的计算问题,称为
如果您尝试在其他程序写入内存时从内存中读取数据,则很可能会得到损坏的数据。您应该使用一个同步原语(锁、信号量、监视器...)以确保这种情况永远不会发生。
我推荐你去看看The Little Book of Semaphores,特别是第4.2章的读者-作者问题。
发布于 2012-02-27 18:32:59
你为什么要用进程而不是线程来做这件事呢?从同步的角度来看,这可能会使您的工作变得更加困难。
如果您正在使用线程,我会告诉您使用信号量来保护您的访问,这样您就可以保证读取器不会读取写入器正在写入的相同数据集;我相信信号量和其他同步原语的实现也适用于进程间共享内存,但这种情况不太常见。
你肯定应该使用别人的同步原语的原因是,在现代硬件上,写入可以被重新排序或延迟,例如第一个程序“当前在第101个服务器上”,但实际上写入到第100个服务器的数据还没有从CPU写回。信号量或互斥量将包括适当的内存隔离指令来刷新写入,以便内存与其他线程/进程保持一致;您绝对应该使用其他人精心编写的实现,而不是编写您自己的同步逻辑。
此外,当您测试时,在多处理器机器上进行测试是非常重要的,因为进程之间的竞争条件不太可能出现在单处理器机器上。
https://stackoverflow.com/questions/9463403
复制相似问题