- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有一个名为 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/
我是一名优秀的程序员,十分优秀!