gpt4 book ai didi

linux - 如何为 *nix 进程实现 writer-preferring 读/写锁

转载 作者:IT王子 更新时间:2023-10-29 00:38:13 29 4
gpt4 key购买 nike

有一个名为 flock() 的 Unix 函数,进程可以使用它来获得对资源的共享(“读”)访问或独占(“写”)访问。问题是它会使那些请求独占访问的进程饿死。这样的请求会一直排队,直到没有进程持有共享锁为止;同时,对共享锁的新请求在等待独占锁的进程“之前”被授予。

显然,请求共享锁的进程越多,写入者等待那个没有未完成的共享锁的偶然时间窗口的时间就越长。

我寻求的行为是这样的:一旦写者请求了独占锁,后续请求共享锁的读者将排在写者之后。这种锁的名称,我' m 告诉,是“writer-preferring read/write lock”。

有几篇文章(特别是 this one)解决了这个问题,但是是在线程级别。我需要的是以这种方式协调进程的面向 Unix/Linux 的解决方案。

更新:我需要解决方案来处理参与进程在持有锁时可能崩溃的可能性,方法是自动移除锁。

最佳答案

您可以使用 referenced question 中描述的方法用于进程间以及线程间同步。您必须确保 pthread_rwlock_t 对象在要同步的进程之间共享的内存中,并使用 pthread_rwlockattr_setpshared() 函数将用于初始化 pthread_rwlock_t 的 pthread_rwlockattr_t 对象标记为 PTHREAD_PROCESS_SHARED。

如果您需要同步在进程退出时自行重置,则需要使用基于不同同步原语的读写锁。我想System V semaphores (otherwise known as XIS IPC semaphores)应该可以解决问题,因为当操纵它们的进程退出而不重置它们时,它们应该自行重置。 System V 信号量是 Linux 内核的可选功能。

您可能希望为此使用具有更高级别锁定抽象的库——如果您使用的是 C++,则可以使用 boost synchronization .但是,我不确定提升同步是否支持由 System V IPC 信号量支持的锁——您可能被迫在 Sys V 信号量集之上滚动自己的读写器锁。具体来说,您需要一个读信号量、一个写信号量和一个写队列信号量。写入者增加写入队列并等待读取和写入信号量变为 0,然后增加写入信号量。读者等待写队列和写信号量变为 0,然后递增读信号量。

关于linux - 如何为 *nix 进程实现 writer-preferring 读/写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27625597/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com