pthread读写器锁和基于fcntl()的文件锁之间有什么区别



对于一个项目,我正在考虑使用pthread reader-writer locksfcntl()-based file locks。我必须在其中作出选择。你能解释一下它们之间的区别吗?优点和缺点是什么?

它们是两种完全不同的工具,通常用于不同的任务。很难将两者进行公正或完全的对比,因为这就像将苹果比作沙发。

TL;DR:

fcntl(2):

  • 咨询锁定接口
  • 主要处理文件
  • 轻松在多个流程之间工作

pthread_rwlock:

  • 咨询锁定接口
  • 序列化对冲突操作(写/读、写/写、读/写)的访问
  • 为单个进程中多个线程之间的共享资源(内存、文件描述符等)提供安全性

基于fcntl(2)的锁对文件或文件中的字节范围实现POSIX咨询锁。由于它们是建议性的,所以没有任何东西强制使用这些锁——所有进程(或线程)都必须协作并尊重锁的语义才能有效。例如,考虑对某个文件f进行操作的两个进程AB。如果进程Af上设置锁,则B可以完全忽略这些锁,并执行它喜欢的任何操作。通常,此接口用于保护多个线程和/或进程之间对整个文件(或文件中的范围)的访问。

pthread_rwlock接口也可以被视为一个咨询锁定系统(所有线程都必须使用API才能使锁定有效)。但是,它不是在文件之上实现的,并且在保护对文件的访问的范围上也不受限制。读写器锁是共享内存互斥接口的一种形式,这样多个读写器可以同时执行一个关键部分,而写入器被阻止,或者单个写入器可以执行一个重要部分,从而阻止所有其他并发读写器。通常,此接口用于在以读取为主的工作负载中保护进程中多个线程之间对共享可变状态(可能是共享内存,可能是文件访问)的访问。此API通常不用于保护多个进程中的并发访问。

如果我决定选择其中一个接口来串行化对某些数据的访问,我会问自己至少几个问题:

  • 我主要处理文件吗
  • 我有多个流程吗

如果主要是为了保护对文件的访问,但只在单个进程中进行访问,那么我可能会选择使用pthread_rwlock。这种方法的缺点是,如果我将来需要使用多个进程来访问文件,我就没有一个好的方法来向其他进程表达我的锁定意图。类似地,如果我主要尝试序列化对某个共享内存的访问,我会使用pthread_rwlock,因为fcntl(2)接口表达了对文件的一些意图。

当尝试在多个进程之间协作读取和写入单个文件时,我可能会使用fcntl(2)。然而,这可能会变得非常复杂,非常迅速。例如,如何处理截断之类的事件?考虑进程A已将1024个字节读取到文件中的情况,该文件随后被进程B截断为0个字节。然后,A必须查找文件的开头,等待写入新数据以继续读取而不会出错——或者正确地附加新数据本身!

解决这些问题需要在额外的文件中进行更多的锁定通信,而且复杂性可能会迅速失控。如果需要实现某种在文件上工作的并发系统,我可能会选择多个线程并使用pthread_rwlock API。在一个过程中实现这样一个系统所需的全部更新更容易管理。在不知道自己面临的要求的情况下,很难以这样或那样的方式进行指导。

相关内容

  • 没有找到相关文章

最新更新