我使用以下 C++ 函数锁定服务器通过 SMB 共享的文件的 1 个字节:
在 Windows 上:
LockFileEx (h, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0, 1,0, &overlapped)
在 Linux 和 Mac OS 上:
fcntl (fd, F_SETLK, &flockdesc)
对于本地共享文件和通过 SMB 共享的文件,我仅用 3 微秒就成功锁定,而对于通过 NFS 共享的文件,我则用 26 毫秒就成功锁定了文件。
我无法理解一个进程如何能够在 3 微秒内通过网络获得锁,因为与服务器通信至少需要几毫秒的时间,就像在 NFS 上共享文件的情况下所观察到的那样。
有人能帮我找出为什么会发生这种情况吗?
答案1
发生这种情况的原因是 Windows 使用 oplocks 进行锁定 ->https://learn.microsoft.com/en-us/windows-hardware/drivers/ifs/oplock-overview