Может ли CreateFile() Открыть один файл одновременно в двух разных потоках

StackOverflow https://stackoverflow.com/questions/1576187

  •  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() поведение будет таким же, если вы вызовете его в одном потоке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top