У нас есть проблема в работе с приложением Windows, написанным на смеси C и C ++, где MoveFileEx иногда сообщает: «Процесс не может получить доступ к файлу, потому что он используется другим процессом».Проблема редкая, но недавно мы смогли воспроизвести проблему в нашей среде разработки.Происходит следующее: процесс A получает данные по сети и создает файл с этими данными, используя:
fd = _open(fileName, O_CREAT | O_WRONLY | O_TRUNC | O_BINARY, _S_IREAD | _S_IWRITE);
...
while (data on network) {
write(fd, buffer, count);
}
...
int close_result = _close(fd);
После этого процесс A открывает файл для чтения и снова закрывает его.Затем процесс A без выхода создает процесс B. При очень высокой нагрузке, когда множество потоков в A и много параллельных процессов B, каждый обрабатывает сотни МБ, процесс B иногда сталкивается с проблемой MoveFileEx.Когда я запускаю Process Monitor для захвата активности файловой системы, я вижу, что когда мы получаем проблему, вышеупомянутый _close (fd) вызывается и не возвращает ошибку, но Process Monitor не регистрирует никакую операцию CloseFile из процесса A для этого _close (fd)) вызов.Похоже, что вызов _close (fd) не достигает операционной системы.Кто-нибудь сталкивался с такой проблемой?Есть идеи, что попытаться это исправить?Я пытался использовать fopen вместо _open и другие виды сбросных вызовов, но, похоже, ничего не помогло.