一个发布者和多个订阅者的访问控制

时间:2017-05-02 18:13:42

标签: c linux

我有一个共享内存块,多个进程可以访问。

对于这个内存块,我有一个写入/更新信息的进程(我称之为发布者),并且我有多个正在读取此数据的进程(我称之为订阅者)。 / p>

这让我相信,因为我不希望订阅者在发布者的写入/更新过程中读取,我需要实现访问控制,以保证当前共享内存中的数据是完全的在订阅者接受之前更新(在写入过程中没有阅读)。

这是我正在尝试设计的行为:

  • 发布者可以修改共享内存,但仅限于当前没有其他订阅者从内存中读取时。
  • 任何订阅者都可以从共享内存中读取,只要发布者当前没有修改它。
  • 订阅者不得修改共享内存,只能读取;因此,允许消费者同时阅读(假设发布者没有修改共享内存)。

我想到的第一个解决方案是一个简单的互斥锁或大小为1的信号量。这意味着每次订阅者想要获取新信息时,他们都需要等待发布者更新内存。但是,这会导致订阅者不得不等待其他订阅者的意外后果,以及如果系统上存在足够的订阅者,则发布者可能会被延迟或无法发布新数据。

我想到的第二个解决方案是调查shm并找到 SHM_LOCK SHM_UNLOCK ,这些似乎对执行有用发布者和订阅者角色,但在其他方面似乎只是帮助强化他们可以做什么,而不一定 他们可以做到。

或者,我在其他地方有相反的情况,其中上面的订阅者成为发布者,每个订阅者可能会也可能不会将共享内存块设置为特定值。 (它们不保证写入内存块,但如果它们写入,则保证发布者的值相同。)上面的发布者成为订阅者。

附录:

  • 每个发布者和订阅者都是一个单独的过程。
  • 我的问题中的“共享内存”代表了多个不同的内存缓存,而不是一个单元。当我的发布者只向N个数据单元中的一个发布更新时,我不希望所有共享内存都被订阅者锁定。
  • 发布者(来自第一部分)是一个守护进程。我的逻辑是,我希望守护进程能够及时采取行动,将数据放在某处;我不希望守护程序在很大程度上受到订阅者的干扰。

我的问题:

  1. 是否有可以正确编码上述逻辑的控制方案? (发布者设置和删除访问权限,订阅者在可访问时读取。)
  2. 在这种情况下,是否有更好的方法将信息发布到多个流程?或者是共享内存在这种情况下的方式?

2 个答案:

答案 0 :(得分:1)

您需要的是read-write lock

使用pthread_rwlock_*的pthreads本机支持这些。 pthread.h。通常pthreads将用于线程。

在多个进程的情况下,您可以使用信号量实现读写锁。做一点阅读和研究,这很容易找到你自己的其余部分。

答案 1 :(得分:0)

通常情况下,您需要两个 mutex es(或更确切地说,两个cond s,可以共享相同的mutex)原因是只有在复杂的条件下锁定访问才容易出现读者不断重叠并阻止访问编写者的问题。使用两个cond时,您可以优先考虑编写器队列,并禁止在写入程序等待获取时阻止读取资源。好吧,我认为作家的数量远远少于读者的数量,因为你可以打到另一边,并阻止读者,因为作家重叠并阻止他们....

最灵活的方法可能是允许编写者和读者按顺序行动(好吧,读者可以并行)使用触发器并在另一侧的工作人员等待访问时准备开关。

无论如何,正如您在其他回复中建议的那样,请查看其他回复中建议的read-write lock