首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >共享内存C++读写同步

共享内存C++读写同步
EN

Stack Overflow用户
提问于 2012-02-27 18:23:52
回答 2查看 2.2K关注 0票数 0

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-27 18:35:09

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

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

我推荐你去看看The Little Book of Semaphores,特别是第4.2章的读者-作者问题

票数 4
EN

Stack Overflow用户

发布于 2012-02-27 18:32:59

你为什么要用进程而不是线程来做这件事呢?从同步的角度来看,这可能会使您的工作变得更加困难。

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

你肯定应该使用别人的同步原语的原因是,在现代硬件上,写入可以被重新排序或延迟,例如第一个程序“当前在第101个服务器上”,但实际上写入到第100个服务器的数据还没有从CPU写回。信号量或互斥量将包括适当的内存隔离指令来刷新写入,以便内存与其他线程/进程保持一致;您绝对应该使用其他人精心编写的实现,而不是编写您自己的同步逻辑。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9463403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档