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