共享内存C++读写同步
Shared memory C++ Read and Write synchronisation
如果两个程序同时访问共享内存,一个写入,另一个从中读取,共享内存会损坏吗?
我有两个程序,一个将从服务器和网络获取一些数据,并将解析后的数据保存到共享内存中,另一个是读取程序,它将读取到最后一个保存的数据集。
例如,如果第一个程序已经从100个服务器收集了数据,并且当前在第101个服务器中,则直到第100个服务器的所有数据都将由读取器程序读取。一旦完成了第101个数据集,则读取器程序将读取第101数据集。在这里,来自服务器的数据集可能具有多个数据,如磁盘空间、负载等。那么这种访问会破坏共享内存中的数据吗?或者我这样做可以吗?
您所描述的实际上是并发中一个常见的计算问题,称为读写器
如果你试图从内存中读取,而其他程序正在写入,你很可能会得到损坏的数据。您应该使用其中一个同步原语(锁、信号量、监视器…)来确保这种情况永远不会发生。
我建议你看一看《信号小书》,特别是第4.2章读者-作家问题。
用进程而不是线程来做这件事有什么原因吗?从同步的角度来看,这可能会让你的生活更加艰难。
如果你使用的是线程,我会告诉你用信号量来保护你的访问,这样你就可以保证读取器不会读取与编写器编写的相同的数据集;我相信信号量和其他同步原语的实现也适用于进程间共享内存,但这有点不常见。
您肯定应该使用其他人的同步原语的原因是,在现代硬件上,写入可以重新排序或延迟,例如,第一个程序"当前在第101台服务器中",但实际上,对第100台服务器的数据写入尚未从CPU写回。信号量或互斥将包括适当的内存围栏指令,以刷新写入,从而使内存看起来与其他线程/进程一致;您绝对应该使用他人精心编写的实现,而不是编写自己的同步逻辑。
此外,当您进行测试时,在多处理器机器上进行测试非常重要,因为进程之间的竞争条件不太可能出现在单处理器盒子上。
- 用C++快速读写文件
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 在一个读写器队列中,我可以用volatile替换原子吗
- C++套接字对不读/写父/子
- 如何调试读写器锁的死锁?
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- Linux 挂载使用重新挂载以允许读写
- C++中读/写二进制文件
- 如何读/写或遍历 std::array 中的特定元素范围?
- 内存排序或读取-修改-写入操作,仅(读/写)内存顺序
- USB-HID 读/写(重叠)等待单个对象不返回C++
- 为什么使用_access时只读测试对读写文件有效
- Boost::Asio串行读/写打开:参数不正确
- UWP 是否有同步文件读/写 API
- 如何制作具有同步数据读/写功能的多客户端服务器
- MVCC实现中的无锁定读写器同步
- 共享内存C++读写同步
- 需要一个好的同步读写解决方案
- 同步多进程与FileLock()读/写同一文件c++ win32