C++ _locking()真正的作用是什么?

C++ _locking()真正的作用是什么?,c++,c,file,winapi,file-locking,C++,C,File,Winapi,File Locking,寻找问题的答案,我找到了函数。它告诉我它锁定或解锁文件的字节(实际上我不明白这句话的真正含义)。如果有人有使用此功能的经验,是否可以使用此功能解决第一个问题中描述的问题?引用您链接的MSDN页面: int _locking( int fd, int mode, long nbytes ); \u locking函数锁定或解锁fd指定的文件的N字节。锁定文件中的字节会阻止其他进程访问这些字节。所有锁定或解锁都从文件指针的当前位置开始,并持续到下一个N字节。可以锁定超过文件结尾

寻找问题的答案,我找到了函数。它告诉我它锁定或解锁文件的字节(实际上我不明白这句话的真正含义)。如果有人有使用此功能的经验,是否可以使用此功能解决第一个问题中描述的问题?

引用您链接的MSDN页面:

int _locking(
   int fd,
   int mode,
   long nbytes 
);
\u locking函数锁定或解锁fd指定的文件的N字节。锁定文件中的字节会阻止其他进程访问这些字节。所有锁定或解锁都从文件指针的当前位置开始,并持续到下一个N字节。可以锁定超过文件结尾的字节

我发现这有助于“修复”问题

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

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

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

回答您的问题

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


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

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

基本上,它允许您以原子方式更新文件的某些部分,因此任何其他读取或写入文件的进程都将看到(或更改)所有更新,或者根本看不到任何更新。它也适用于读-你可以锁定一个文件的范围,你想阅读,以防止另一个过程改变部分,而你正在阅读它。 但是进程仍然可以访问文件的其他部分,而不会出现错误或延迟


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

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

是的,我读过这篇文章。但当我试图锁定一个文件时,我无法在同一过程中通过ofstream写入该文件。那么锁定字节到底意味着什么呢?这个函数锁定所有写入的文件,并使其仅从这些字节中可读。用户可以很容易地添加一个标志,在进入文件之前让线程检查。@Dennis:根据文档,锁阻止对范围的任何访问-读取或写入。我必须做一些测试来证明它是否真的有问题。这也是有道理的,如果进程A正在更改文件中的记录,则进程B在更新完成之前不会读取该记录。@Dennis:也不要高估“添加标志”的容易程度。如果希望线程间访问检查对文件范围进行细化,则需要保留某种类型的数据结构,以指示哪些范围被锁定,并且需要同步机制(关键部分对象或其他)来管理对该数据结构的访问。这不像检查标志那么简单。此外,您还需要在任何需要的地方显式添加访问检查。如果您没有在所有正确的时间进行检查,那么线程B将访问该范围,而线程A将其“锁定”。这就是我链接到竞态条件的全部要点。他在使用这个函数时也会遇到同样的问题。他必须检查文件是否已锁定,如果文件已锁定,请执行“等待”。他甚至会遇到僵局或其他许多问题。我知道他想锁定和解锁一个文件。这只锁了一部分,他还得做所有其他的工作。“但我想我可能错了,所以没关系。”迈克尔·伯尔谢谢你的回答。但我不认为它是这样工作的。当我在_LK_NBLCK模式下使用函数锁定文件的所有字节时,我甚至无法在同一进程中读取文件(strerror是“权限被拒绝”)。也许我做错了什么,应该从传递给
\u locking()
的同一个fd中读取,而不是再次打开文件?@smerlin:是的;这是独家的。