【发布时间】:2012-06-08 19:39:55
【问题描述】:
我正在尝试找出一种方法来同步两个共享数据的进程。
基本上我有两个使用共享内存链接的进程。我需要进程 A 在共享内存区域中设置一些数据,然后进程 B 读取该数据并对其进行操作。
我期待的事件顺序是:
- B 块等待数据可用信号
- A 写入数据
- A 信号数据可用
- B 读取数据
- B 块等待数据不可用信号
- A 信号数据不可用
- 一切回到起点。
换句话说,B 会阻塞,直到它收到“1”信号,获取数据,然后再次阻塞,直到该信号变为“0”。
我已经成功地使用纯共享内存来模拟它,但是要么我使用一个消耗 100% CPU 时间的 while 循环来阻塞,要么我使用一个带有 nanosleep 的 while 循环,它有时会错过一些信号。
我尝试过使用信号量,但我只能找到一种方法来等待一个零,而不是一个,并且尝试使用两个信号量只是没有用。我不认为信号量是要走的路。
会有很多进程都访问同一个共享内存区域,并且当共享内存被修改时需要通知所有进程。
它基本上是在尝试模拟硬件数据和控制总线,其中事件是边沿触发而不是电平触发。我感兴趣的是状态之间的转换,而不是状态本身。
那么,有什么想法或想法吗?
【问题讨论】:
-
循环如何消耗 100% 的内存?
-
PS:您可能会考虑使用 pthreads 数据结构,在这种情况下是条件变量。 (是的,我知道您正在使用单独的进程,但是您可以将 condvar 扔到共享内存段中)
-
哎呀......这应该是 100% 的 CPU 时间。
-
@H2CO3 信号会很好,但我无法预测哪些进程将访问共享内存。可能是多个进程。
-
共享内存听起来像是问题的根源。为什么不使用更合适的 IPC 机制?
标签: c linux shared-memory