共享内存C++读写同步

Shared memory C++ Read and Write synchronisation

本文关键字:同步 读写 C++ 内存 共享      更新时间:2023-10-16

如果两个程序同时访问共享内存,一个写入,另一个从中读取,共享内存会损坏吗?

我有两个程序,一个将从服务器和网络获取一些数据,并将解析后的数据保存到共享内存中,另一个是读取程序,它将读取到最后一个保存的数据集。

例如,如果第一个程序已经从100个服务器收集了数据,并且当前在第101个服务器中,则直到第100个服务器的所有数据都将由读取器程序读取。一旦完成了第101个数据集,则读取器程序将读取第101数据集。在这里,来自服务器的数据集可能具有多个数据,如磁盘空间、负载等。那么这种访问会破坏共享内存中的数据吗?或者我这样做可以吗?

您所描述的实际上是并发中一个常见的计算问题,称为读写器

如果你试图从内存中读取,而其他程序正在写入,你很可能会得到损坏的数据。您应该使用其中一个同步原语(锁、信号量、监视器…)来确保这种情况永远不会发生。

我建议你看一看《信号小书》,特别是第4.2章读者-作家问题

用进程而不是线程来做这件事有什么原因吗?从同步的角度来看,这可能会让你的生活更加艰难。

如果你使用的是线程,我会告诉你用信号量来保护你的访问,这样你就可以保证读取器不会读取与编写器编写的相同的数据集;我相信信号量和其他同步原语的实现也适用于进程间共享内存,但这有点不常见。

您肯定应该使用其他人的同步原语的原因是,在现代硬件上,写入可以重新排序或延迟,例如,第一个程序"当前在第101台服务器中",但实际上,对第100台服务器的数据写入尚未从CPU写回。信号量或互斥将包括适当的内存围栏指令,以刷新写入,从而使内存看起来与其他线程/进程一致;您绝对应该使用他人精心编写的实现,而不是编写自己的同步逻辑。

此外,当您进行测试时,在多处理器机器上进行测试非常重要,因为进程之间的竞争条件不太可能出现在单处理器盒子上。