Может ли CreateFile() Открыть один файл одновременно в двух разных потоках
-
21-09-2019 - |
Вопрос
Может ли CreateFile() Открыть один файл одновременно в двух разных потоках
void new_function(void * what)
{
HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE |
FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE)
{
DWORD d = GetLastError();
return ;
}
Sleep(10000);
}
int main()
{
HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Sleep(10000);
return 1;
}
каждый раз, когда он выходит в GetLastError
положение.и ошибка заключается в следующем ERROR_SHARING_VIOLATION
(32, "Процесс
не может получить доступ к файлу, поскольку он используется другим
процессом".)
если я не могу поделиться открытым файлом, то какой смысл в FILE_SHARE_WRITE | FILE_SHARE_READ
спасибо
The program environment is Win32 Vs2003
Решение
Дескриптор файла - это всегда общий доступ между потоками.Все, что вам нужно будет сделать, это просто использовать дескриптор как обычно, но в двух потоках.
Ваш второй звонок в CreateFile()
сбой из-за того, что вы запрашиваете дополнительный доступ, GENERIC_ALL
, чем вы разрешаете общий доступ, FILE_SHARE_WRITE | FILE_SHARE_READ
.
Если бы вы вместо этого запросили только GENERIC_READ | GENERIC_WRITE
, это увенчалось бы успехом.
Тот самый CreateFile()
поведение будет таким же, если вы вызовете его в одном потоке.