gpt4 book ai didi

c++ - CreateFile() ERROR_SHARING_VIOLATION 单线程

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:55 27 4
gpt4 key购买 nike

为什么单个线程不能使用 CreateFile 和对进程的独占文件锁 打开同一个文件 tqize?以下示例将在同一线程第二次尝试打开文件时失败,并出现 ERROR_SHARING_VIOLATION 异常:

ERROR_SHARING_VIOLATION 32 (0x20) The process cannot access the file because it is being used by another process.

强调上面的“过程”二字;它是尝试打开同一个文件 twize 的同一个进程(甚至同一个线程)。

#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hOutputFile1 = CreateFile(
// File name
L"test.dat",
// Requested access to the file
GENERIC_READ | GENERIC_WRITE,
// Share mode. 0 equals exclusive lock for the process
0,
// Pointer to a security attribute structure
NULL,
// Action to take on file
OPEN_ALWAYS,
// File attributes and flags
FILE_ATTRIBUTE_NORMAL,
// Template file
NULL
);
if (hOutputFile1 == INVALID_HANDLE_VALUE)
{
// Error
DWORD lastError = GetLastError();
return (int)lastError;
}

// opening the same file for the second time will return a ERROR_SHARING_VIOLATION exception
HANDLE hOutputFile2 = CreateFile(
// File name
L"test.dat",
// Requested access to the file
GENERIC_READ | GENERIC_WRITE,
// Share mode. 0 equals exclusive lock by the process
0,
// Pointer to a security attribute structure
NULL,
// Action to take on file
OPEN_ALWAYS,
// File attributes and flags
FILE_ATTRIBUTE_NORMAL,
// Template file
NULL
);
if (hOutputFile2 == INVALID_HANDLE_VALUE)
{
// Error
DWORD lastError = GetLastError();
return (int)lastError;
}

return 0;
}

最佳答案

错误消息文本有点误导,但对 CreateFile 的两次调用是从同一进程中的同一线程发出的这一事实不会改变任何内容。一旦对 CreateFile 进行了第一次调用,随后对 CreateFile 的调用,无论它们来自何处,都必须遵守共享规则。

我猜错误消息文本试图捕获共享违规的最常见来源。即两个进程竞争同一个文件。但一个简单的事实是,一旦您使用独占共享打开了一个文件,那么其他打开该文件的尝试都不会成功。

关于c++ - CreateFile() ERROR_SHARING_VIOLATION 单线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25023633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com