C++ 锁定文件 Windows 阻塞模式
Posted
技术标签:
【中文标题】C++ 锁定文件 Windows 阻塞模式【英文标题】:C++ Lock File Windows Blocking Mode 【发布时间】:2012-02-29 11:20:46 【问题描述】:如何在 Windows 上以阻塞方式使用 C++ 阻塞文件?通过阻塞,我的意思是......请求锁定,如果文件被锁定,它将等待直到它被解锁,一旦文件被另一个系统进程解锁,执行就会恢复。
P.S.:如果有某种跨平台解决方案,我会更喜欢它。
【问题讨论】:
您真的要锁定文件,还是只是想同步进程?如果是后者,那么您可以使用全局互斥锁(即在不同进程中调用CreateMutex
时使用相同的lpName
参数)。
【参考方案1】:
默认情况下,LockFileEx 会阻塞直到可以获取锁(尽管您可以通过 LOCKFILE_FAIL_IMMEDIATELY 告诉它不要这样做)。
显然这不是跨平台的。
更新
这个可怕的代码示例说明了它的工作原理(您可能需要将 CreateFile 中的文件名从“lockBlock.cpp”更改)。运行程序的一个实例,它将获得锁。运行第二个实例,它将阻塞。在第一个实例中按
int _tmain(int argc, _TCHAR* argv[])
HANDLE hFile = ::CreateFileA("lockBlock.cpp", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
OVERLAPPED overlapped;
memset(&overlapped, 0, sizeof(overlapped));
const int lockSize = 10000;
printf("Taking lock\n");
if (!LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, lockSize, 0, &overlapped))
DWORD err = GetLastError();
printf("Error %i\n", err);
else
printf("Acquired lock\n");
getchar();
UnlockFileEx(hFile, 0, lockSize, 0, &overlapped);
printf("Released lock\n");
return 0;
【讨论】:
我已经使用 LockFileEx 制作了一个“玩具示例”,它似乎没有阻塞,即使我没有 LOCKFILE_FAIL_IMMEDIATELY。这很奇怪......如果它有效,我会将你的答案标记为正确。 @petersaints:你在使用异步 I/O 吗? 没有。我一定要吗?从我在文档中阅读的内容来看,这似乎有点令人困惑。它似乎与我对异步 I/O 的期望不同(来自描述)。 没有。异步 I/O 将导致它不会阻塞——稍后当锁空闲时你会收到通知。但是,如果您不使用异步 I/O,它应该可以正常工作。我试试看。 它工作正常。我发现与我所做的唯一不同的是使用了重叠。它到底是什么意思?现在我将测试这是否有效,例如,当将文件复制到目录时。以上是关于C++ 锁定文件 Windows 阻塞模式的主要内容,如果未能解决你的问题,请参考以下文章
使用windows c++ LockFIle() 锁定文件然后从中获取流?