che*_*kow 5 linux multithreading file-locking
我正在开发一个多线程应用程序,其中多个线程可能需要独占访问同一文件。我正在寻找一种序列化这些操作的方法。我打算使用flock、lockf或fcntl锁定。然而,使用这些方法,当第一个线程已经拥有锁时,第二个线程尝试锁定文件似乎将被授予,因为这两个线程位于同一进程中。这是根据flock和fnctl的手册页(我猜在linux中lockf是用fnctl实现的)。也得到了另一个问题的支持。那么,在 Linux 中是否有其他方法可以在线程级而不是进程级锁定文件呢?
我提出的一些我不喜欢的替代方案是:
1) 使用通过 O_CREAT | 打开的锁文件 (xxx.lock) O_EXCL 标志。如果存在争用,则此调用仅在一个线程中成功。这样做的问题是,其他线程必须在调用上旋转,直到它们获得锁定,这意味着我必须 _yield() 或 sleep() ,这让我认为这不是一个很好的选择。
2) 保留所有打开文件的互斥列表。当线程想要打开/关闭文件时,它必须首先锁定列表。打开文件时,它会搜索列表以查看它是否已打开。这听起来特别低效,因为即使文件尚未被拥有,它也需要大量的工作。
还有其他方法可以做到这一点吗?
编辑: 我刚刚在系统的手册页中发现了这段文本,但它不在在线手册页中:
如果进程使用 open(2) (或类似的)来获取同一文件的多个描述符,则这些描述符将由 flock() 独立处理。使用这些文件描述符之一锁定文件的尝试可能会被调用进程已经通过另一个描述符放置的锁拒绝。
我对“可能被拒绝”这个词不满意,我更喜欢“将被拒绝”,但我想是时候测试一下了。