4

我正在开发一个多线程应用程序,其中多个线程可能希望独占访问同一个文件。我正在寻找一种序列化这些操作的方法。我打算使用flock、lockf 或fcntl 锁定。但是,使用这些方法,当第一个线程已经拥有锁时,将允许第二个线程尝试锁定文件,因为这两个线程在同一个进程中。这是根据flockfnctl的手册页(我猜在linux中lockf是用fnctl实现的)。这个其他问题也支持。那么,是否有其他方法可以在 linux 中锁定文件,它在线程级别而不是进程级别工作?

我想出的一些我不喜欢的替代方案是:

1) 使用用 O_CREAT | 打开的锁文件 (xxx.lock) O_EXCL 标志。如果存在争用,此调用将仅在一个线程中成功。这样做的问题是,然后其他线程必须在调用上旋转,直到它们获得锁定,这意味着我必须 _yield() 或 sleep() 这让我认为这不是一个很好的选择。

2)保留所有打开文件的互斥列表。当一个线程想要打开/关闭一个文件时,它必须首先锁定列表。打开文件时,它会搜索列表以查看它是否已打开。这听起来特别低效,因为即使文件尚未拥有,它也需要大量工作。

还有其他方法吗?

编辑: 我刚刚在我的系统手册页中发现了这个文本,它不在在线手册页中:

如果一个进程使用 open(2) (或类似方法)为同一个文件获取多个描述符,这些描述符将由flock() 独立处理。使用这些文件描述符之一锁定文件的尝试可能会被调用进程已通过另一个描述符放置的锁定拒绝。

我对“可能被拒绝”这个词不满意,我更喜欢“将被拒绝”,但我想是时候测试一下了。

4

0 回答 0