【发布时间】:2010-03-31 17:16:40
【问题描述】:
在 Linux 上,我使用 shmget 和 shmat 设置一个共享内存段,一个进程将写入该共享内存段,一个或多个进程将读取该段。共享的数据大小为几兆字节,更新时会完全重写;它从未部分更新。
我的共享内存段布局如下:
------------------------- | t0 |实际数据 | t1 | -------------------------其中 t0 和 t1 是写入器开始更新的时间的副本(具有足够的精度,以保证连续更新具有不同的时间)。写入器首先写入 t1,然后复制数据,然后写入 t0。另一方面,阅读器读取 t0,然后是数据,然后是 t1。如果读取器获得相同的 t0 和 t1 值,则认为数据一致且有效,否则,它会重试。
这个程序是否确保如果读者认为数据是有效的,那么它实际上是有效的?
我是否需要担心乱序执行 (OOE)?如果是这样,使用memcpy 获取整个共享内存段的读者会克服读者方面的OOE 问题吗? (这假设memcpy 执行它的复制线性并通过地址空间升序。这个假设是否有效?)
【问题讨论】:
-
为什么要这样做?互斥锁相当便宜。此外,如果您担心开销,您可以提出一些基于原子类型的同步(就像您尝试使用 t0 和 t1 一样)。
-
为什么?因为我很懒,试图让最简单的事情发挥作用。此外,我不希望作者等待锁。它还有其他的处理,它是我最初没有写的代码,我不打算修改它,让它等待读者读完。确保读者在阅读时获得一致的数据对我来说并不重要,只要他们知道数据是否一致即可。
标签: c++ linux concurrency locking shared-memory