【问题标题】:C++ Lock File Windows Blocking ModeC++ 锁定文件 Windows 阻塞模式
【发布时间】:2012-02-29 11:20:46
【问题描述】:

如何在 Windows 上以阻塞方式使用 C++ 阻塞文件?通过阻塞,我的意思是......请求锁定,如果文件被锁定,它将等待直到它被解锁,一旦文件被另一个系统进程解锁,执行就会恢复。

P.S.:如果有某种跨平台解决方案,我会更喜欢它。

【问题讨论】:

  • 您真的要锁定文件,还是只是想同步进程?如果是后者,那么您可以使用全局互斥锁(即在不同进程中调用CreateMutex 时使用相同的lpName 参数)。

标签: c++ windows visual-c++ blocking lockfile


【解决方案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,它应该可以正常工作。我试试看。
  • 它工作正常。我发现与我所做的唯一不同的是使用了重叠。它到底是什么意思?现在我将测试这是否有效,例如,当将文件复制到目录时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2013-01-16
  • 2013-11-11
  • 2012-02-08
  • 2012-01-14
相关资源
最近更新 更多