我有一个共享内存块,多进程访问。我有一个写/更新信息(我称之为发布者)的进程,而且我有多个正在读取这些数据的进程(我正在调用订阅者)。一个发布者和多个订阅者的访问控制
这使我相信,因为我不希望订阅者在发布者写入/更新过程中读取数据,所以我需要实现访问控制,以确保当前共享内存中的数据是在订阅者接受之前完全更新(在写入过程中没有阅读)。
这是我想要设计的行为:
- 出版商可以修改共享内存,但只有在没有其他用户正在从内存中读取。
- 任何订阅服务器都可以从共享内存中读取,只要发布服务器当前未修改它即可。
- 订户不得修改共享内存,只能读取;因此,允许消费者同时进行阅读(假设发布者不修改共享内存)。
我想到的第一个解决方案是一个简单的互斥量或大小为1的信号量。这意味着每次订阅者想要获取新信息时,他们都需要等待内存被更新出版商。然而,这具有订户不得不等待其他订户的意想不到的后果,并且如果系统上存在足够的订户,则发布者被延迟或锁定在发布新数据的能力之外的可能性。
我想起了一直在寻找进入shm
,发现SHM_LOCK
和SHM_UNLOCK
,这似乎强制执行发布服务器和订阅的角色是有用的,但在其他方面似乎只是帮助加强什么他们可以做,而不是第二个解决方案必然当他们可以做到这一点。
或者,我在其他地方有相反的情况,其中上面的订阅者成为发布者,每个发布者可能会或可能不会将共享内存块设置为特定值。 (他们不保证写入内存块,但是如果他们确实写入的话,这些值在发布者中保证是相同的。)上面的发布者成为订阅者。
附录:
- 每个发布者和订阅是一个单独的过程。
- 在我的问题中'共享内存'代表多个不同的内存缓存,而不是一个单元。当我的发布者向N个数据单元中的一个发布更新时,我不希望所有共享内存都从订阅者锁定。
- 发布者(来自第一部分)是一个守护进程。我的逻辑是,我希望守护进程能够及时采取行动,将数据放在某个地方;我不希望订阅者在很大程度上干扰这个守护进程。
我的问题:
- 有没有可以正确编码上面的逻辑控制方案? (发布者设置并删除访问,订阅者在可访问时读取。)
- 在这种情况下,是否有更好的方法将信息发布到多个进程?还是共享记忆在这种情况下走的路?
有一个_ [很好的教程](https://www.classes.cs.uchicago.edu/archive/2017/winter/51081-1/LabFAQ/lab7/Semaphores.html)_讨论同步和信号灯。 – ryyker