【问题标题】:Open File Description Locks confusion(EDIT)打开文件描述锁定混乱(编辑)
【发布时间】:2018-02-06 16:04:00
【问题描述】:

GNU C Library documentation fcntl(F_OFD_SETLK) 锁定打开的文件表条目,(通常由open() 获得)。容易理解。

但在同一文档中的 next example 中:

在示例进程中,每个线程调用open(),因此每个文件描述符应该指向不同的打开文件表条目。

如果在每个线程中从 fcntl(fd, F_OFD_SETLKW, &lck) 获取的锁与一个新的打开文件表条目相关联,则每个线程都在每个线程中获取由 open() 返回的这个新打开文件表条目的锁线程。

那么不同文件表项上的锁怎么能提供独占写访问呢?

我错过了什么?

【问题讨论】:

  • 我不明白这个问题。为什么您认为“只是在不同的打开文件表条目上获得锁定......意味着这种锁定是完全错误的”?
  • 该示例显示了每个线程如何锁定文件以获得独占写入访问权限,从而导致其他线程停止直到锁定被释放。现在你的问题是什么?
  • 如果从每个线程中的 fcntl(fd, F_OFD_SETLKW, &lck) 获取的锁与一个新的打开文件表条目相关联,那么每个线程都将在这个新的打开文件表条目上获得一个锁open() 在每个线程中。那么不同文件表项上的锁怎么能提供独占写访问呢?

标签: linux-kernel glibc locking multithreading flock


【解决方案1】:

每个进程锁定的原始 POSIX 文件锁定。结果,如果两个线程打开同一个文件,导致不同文件描述符,它们都可以同时获得排他锁(因为进程被认为是锁所有者)。这些语义(结合close 行为)相当无用,但出于向后兼容性的原因无法更改。

因此需要单独的 OFD 锁 fcntl 操作,其行为就像使用传统 POSIX 锁在单独的进程中打开文件一样。在这两种情况下,内核都必须确定底层文件对象/inode 并锁定它;锁定文件描述符或文件描述是不够的。或者换一种说法,POSIX 锁和 OFD 锁的区别在于 POSIX 锁可以搭载进程已经获取的锁(有点类似于递归互斥锁,但不完全一样),而对于 OFD 锁,调用线程是锁拥有者。但实际的锁定总是在文件上执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多