【问题标题】:What does _locking() really do?_locking() 究竟做了什么?
【发布时间】:2023-03-15 13:01:01
【问题描述】:

寻找this问题的答案我找到了函数_locking()。那里告诉它Locks or unlocks bytes of a file(实际上我无法理解这句话的真正含义)。如果有人有使用此功能的经验,是否可以使用该功能解决第一个问题中描述的问题?

【问题讨论】:

    标签: c++ c file winapi file-locking


    【解决方案1】:

    引用您链接的 MSDN 页面:

    int _locking(
       int fd,
       int mode,
       long nbytes 
    );
    

    _locking 函数锁定或解锁 fd 指定的文件的 nbytes 个字节。锁定文件中的字节可防止其他进程访问这些字节。所有锁定或解锁都从文件指针的当前位置开始,并持续到下一个 nbytes 个字节。可以锁定文件末尾之后的字节。

    【讨论】:

    • 是的,我读过这个。但是当我尝试锁定文件时,我无法在同一进程中通过 ofstream 写入文件。那么锁定字节的真正含义是什么?
    【解决方案2】:

    它只是保留一个文件范围,供获取文件锁的进程独占使用。如果锁调用成功,另一个尝试读取或写入该文件部分的进程将失败。这允许多个进程访问同一个文件并以一致的方式更新它。它有点像一个文件范围的互斥锁。

    基本上,它允许您以原子方式更新文件的某些部分,因此任何其他读取或写入文件的进程都将看到(或更改)所有更新,或者一个都看不到。它也适用于读取 - 您可以锁定要读取的文件范围,以防止其他进程在您正在读取文件时更改其中的一部分。

    但是进程仍然可以访问文件的其他部分而不会出错或延迟。

    它不会解决您所指问题中的问题,因为_lock() on;t 在进程粒度上工作。如果线程 A 锁定了一个文件范围,那么同一进程中的线程 B 仍然可以读取/写入该范围。为了防止同一进程中的另一个线程访问文件范围,该进程必须实现自己的内部机制,以尊重文件范围已被另一个线程锁定。至少我不知道在 Win32 API 中有什么功能(我想可能有一些我不知道的东西)。

    【讨论】:

    • 此函数锁定所有写入的文件,并使其只能从这些字节中读取。用户可以轻松添加一个全局标志,以便在输入文件之前检查线程。
    • @Dennis:根据文档,锁可以防止对范围的任何访问(读取或写入)。我必须进行一些测试来证明它是否不是这样。这也是有道理的,如果进程 A 正在更改文件中的记录,那么进程 B 在更新完成之前不想读取记录。
    • @Dennis:也不要高估“添加标志”可能有多么容易。如果您希望线程间访问检查细化到文件范围,则需要保留某种数据结构来指示哪些范围被锁定,并且您需要同步机制(关键部分对象或其他)来管理对该数据的访问结构体。这不像检查标志那么简单。此外,您需要在需要的任何地方显式添加访问检查。如果您没有在所有正确的时间进行检查,那么线程 B 将访问该范围,而线程 A 将其“锁定”。
    • 这是我链接到比赛条件的重点。他在使用这个功能时也会遇到同样的问题。如果文件被锁定“等待”,他将不得不检查文件是否被锁定。他甚至可能遇到死锁或许多其他问题。我了解他想锁定和解锁文件。这只是锁定了一部分,他仍然需要完成所有其他工作。但我想我可能是错的,所以没关系。
    • @Michael Burr 感谢您的回复。但我不认为它是这样工作的。当我在 _LK_NBLCK 模式下使用函数锁定文件以锁定文件的所有字节时,我什至无法在同一进程中读取文件(strerror 是“权限被拒绝”)。也许我做错了什么,应该从传递给_locking()的同一个fd读取而不是再次打开文件?
    【解决方案3】:

    http://msdn.microsoft.com/en-us/library/8054ew2f(v=vs.71).aspx

    我发现这有助于“解决”问题Race condition

    最后写入文件的人获胜。假设你只需要读取文件的前半部分,没有理由锁定整个文件。

    因此,您将文件大小(以字节为单位)传递给此函数,然后将其锁定。

    如果成功,该函数将返回 0。返回值 –1 表示失败,在这种情况下 errno 设置为 MSDN 页面告诉您的内容。

    回答您的问题

    您可以获取文件的大小然后将其锁定,但您只能从文件中读取。您只将其锁定为一种读取模式。

    在 Race condition 的 wiki 中,它告诉您如何通过获取第二个进程来检查标志来锁定文件的示例,这可能适用于您的情况。

    【讨论】:

      【解决方案4】:

      它阻止其他进程访问文件的同一部分。

      【讨论】:

      • @smerlin:是的;这是独家的。
      猜你喜欢
      • 2012-07-23
      • 2016-09-10
      • 2012-10-17
      • 2021-06-04
      • 1970-01-01
      • 2018-07-30
      • 2019-10-06
      • 2021-01-01
      • 2011-11-09
      相关资源
      最近更新 更多