我有一个共享内存块,多个进程可以访问。
对于这个内存块,我有一个写入/更新信息的进程(我称之为发布者),并且我有多个正在读取此数据的进程(我称之为订阅者)。 / p>
这让我相信,因为我不希望订阅者在发布者的写入/更新过程中读取,我需要实现访问控制,以保证当前共享内存中的数据是完全的在订阅者接受之前更新(在写入过程中没有阅读)。
这是我正在尝试设计的行为:
我想到的第一个解决方案是一个简单的互斥锁或大小为1的信号量。这意味着每次订阅者想要获取新信息时,他们都需要等待发布者更新内存。但是,这会导致订阅者不得不等待其他订阅者的意外后果,以及如果系统上存在足够的订阅者,则发布者可能会被延迟或无法发布新数据。
我想到的第二个解决方案是调查shm
并找到 SHM_LOCK
和 SHM_UNLOCK
,这些似乎对执行有用发布者和订阅者角色,但在其他方面似乎只是帮助强化他们可以做什么,而不一定 他们可以做到。
或者,我在其他地方有相反的情况,其中上面的订阅者成为发布者,每个订阅者可能会也可能不会将共享内存块设置为特定值。 (它们不保证写入内存块,但如果它们写入,则保证发布者的值相同。)上面的发布者成为订阅者。
附录:
我的问题:
答案 0 :(得分:1)
您需要的是read-write lock。
使用pthread_rwlock_*
的pthreads本机支持这些。 pthread.h。通常pthreads将用于线程。
在多个进程的情况下,您可以使用信号量实现读写锁。做一点阅读和研究,这很容易找到你自己的其余部分。
答案 1 :(得分:0)
通常情况下,您需要两个 mutex
es(或更确切地说,两个cond
s,可以共享相同的mutex
)原因是只有在复杂的条件下锁定访问才容易出现读者不断重叠并阻止访问编写者的问题。使用两个cond
时,您可以优先考虑编写器队列,并禁止在写入程序等待获取时阻止读取资源。好吧,我认为作家的数量远远少于读者的数量,因为你可以打到另一边,并阻止读者,因为作家重叠并阻止他们....
最灵活的方法可能是允许编写者和读者按顺序行动(好吧,读者可以并行)使用触发器并在另一侧的工作人员等待访问时准备开关。
无论如何,正如您在其他回复中建议的那样,请查看其他回复中建议的read-write lock。