寻找this问题的答案,我找到了函数_locking()。有人告诉它Locks or unlocks bytes of a file
(实际上我无法理解这句话究竟是什么意思)。如果有人有使用此功能的经验,是否可以使用该功能解决第一个问题中描述的问题?
答案 0 :(得分:1)
引用您链接的MSDN页面:
int _locking(
int fd,
int mode,
long nbytes
);
_locking 功能可锁定或解锁 fd 指定的文件的 nbytes 字节。锁定文件中的字节可防止其他进程访问这些字节。所有锁定或解锁都从文件指针的当前位置开始,然后继续执行下一个 nbytes 字节。可以将字节锁定在文件末尾。
答案 1 :(得分:1)
它只保留一个文件范围,专门用于获取文件锁的进程。如果锁定调用成功,则尝试读取或写入该部分文件的另一个进程将失败。这允许多个进程访问同一文件并以连贯的方式更新它。它有点像一个文件范围的互斥锁。
基本上它允许您以原子方式更新文件的某些部分,因此读取或写入文件的任何其他进程都将看到(或更改)所有更新,或者都不会。它也适用于读取 - 您可以锁定要读取的文件范围,以防止另一个进程在您正在阅读时更改其中的一部分。
但是进程仍然可以访问文件的其他部分而不会出现错误或延迟。
它不会解决您所引用的问题中的问题,因为_lock()
on; t适用于流程粒度。如果线程A锁定文件范围,则同一进程中的线程B仍然可以读取/写入该范围。为了防止同一进程中的另一个线程访问文件范围,该进程必须实现自己的内部机制,以尊重文件范围已被另一个线程锁定。至少我没有意识到在Win32 API中有这样的东西(我想可能会有一些我不知道的东西)。
答案 2 :(得分:0)
http://msdn.microsoft.com/en-us/library/8054ew2f(v=vs.71).aspx
我发现这有助于“修复”问题Race condition!
写入文件的最后一个人获胜。假设您只需要读取文件的前半部分,无理由锁定整个文件。
因此,您将文件大小以字节为单位传递给此函数,然后将其锁定。
如果成功,该函数将返回0。返回值-1表示失败,在这种情况下,errno设置为MSDN页面告诉您的内容。
回答您的问题
您可以获取文件的大小然后将其锁定,但您只能从文件中读取。你只能将它锁定在某种阅读模式中。
在Race条件的wiki中,它告诉你如何锁定文件的示例,方法是让第二个进程检查一个标志,这可能会在你的情况下查看它。
答案 3 :(得分:0)
它可以防止其他进程访问该文件的同一部分。