我试图locking一个文件,因为它坐在一个networking驱动器上,多个计算机上的多个程序实例需要编辑它。 为了防止损坏,我打算设置它,以便一次只有一个实例拥有权限。
我实现了一个锁,理论上它将locking文件的前100个字节。 我使用Qt自己的文件处理,但它有一个返回一个通用文件句柄的方法。
QFile file(path); HANDLE handle = (HANDLE)_get_osfhandle(file.handle()); OVERLAPPED ov1; memset(&ov1,sizeof(ov1)); ov1.Offset = 0; ov1.OffsetHigh = 0; if (handle == INVALID_HANDLE_VALUE) { // error return; } LockFileEx(handle,LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK,100,&ov1); qDebug() << file.readLine();
LockFileEx()返回1 ,所以它似乎已经成功。 但是,如果我在多个实例中运行程序,它们都可以读取并打印文件的第一行。 除此之外,我可以用任何文本编辑器自由编辑文件。 作为一个networking文件不是一个问题,因为它与本地文件的行为相似。
C ++的Windows线程和互斥问题
boost :: interprocess :: named_mutex与CreateMutex
是否有可能在Windows中进行静态初始化互斥锁?
Pthread互斥锁由不同的线程解锁
模仿后CreateMutex失败
自定义RAII C ++实现范围互斥锁
问题是,当程序没有终止时, QFile变量是本地的,所以在完成函数之后, QFile的析构函数被调用,所以它释放了文件。 操作系统似乎已经释放了锁。
如果我的QFile幸存的范围,一切正常。 一个小问题是,虽然我期望文件被锁定而不能读取,但是外部程序确实只能读取文件。 这不是问题,因为我的程序可以检查是否可以创建一个锁,并检测失败。 这意味着预期的互斥功能起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。