linux – 如何为* nix进程实现编写器优先读/写锁
有一个名为flock()的Unix函数,进程可以使用它来获取对资源的共享(“读取”)访问或独占(“写入”)访问.问题是它会使那些请求独占访问的进程匮乏.这样的请求保持排队,直到没有进程持有共享锁;同时,新的共享锁请求被“授权”在等待独占锁定的进程之前.
显然,请求共享锁的进程越多,编写器就必须等待没有未完成的共享锁的偶然时间窗口. 我寻求的行为是这样的:一旦作家请求了一个独占锁,后来请求共享锁的读者将排在作者后面.我被告知,这种类型的锁的名称是“编写器更喜欢读/写锁”. 有几个帖子(特别是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.但是,我不确定boost同步是否支持System V IPC信号量支持的锁定 – 您可能被迫在Sys V信号量集上滚动你自己的读写器锁.具体来说,您将需要读取信号量,写入信号量和写入队列信号量.写入器递增写入队列并等待读取和写入信号量变为0,然后递增写入信号量.读取器等待写入队列并将信号量写入0,然后递增读取信号量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |