如何为*nix进程实现编写器优先读/写锁

Cha*_*hap 6 unix linux locking interprocess

有一个称为flock()进程可用于获取资源的共享("读取")访问或独占("写入")访问的Unix函数.问题是它会使那些请求独占访问的进程匮乏.这样的请求保持排队,直到没有进程持有共享锁; 同时,新的共享锁请求被"授权"在等待独占锁定的进程之前.

显然,请求共享锁的进程越多,编写器就必须等待没有未完成的共享锁的偶然时间窗口.

我寻求的行为是这样的:一旦作家请求了一个独占锁,后来请求共享锁的读者将排在作者后面.我被告知,这种类型的锁的名称是"编写器更喜欢读/写锁".

有几个职位(这个特别),解决了这个问题,但在线程级.我需要的是一个面向Unix/Linux的解决方案,用于以这种方式协调进程.

更新:我需要通过自动删除锁来解决参与进程在保持锁定时崩溃的可能性.

ant*_*oft 2

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

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

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