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() 锁定文件然后从中获取流?

我可以在 C++ 中读取 Windows 中的文件而不锁定包含该文件的文件夹吗

双重检查和锁定模式是不是适用于 C++(不是 11)?

C++ MinGW 如何从 Windows 编译 Linx

PHP 之文件锁解决并发问题

在 Windows 中创建 C++ 非阻塞计时器