Состояние гонки с файлом чтения IOCP - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь использовать IOCP для чтения файлов в асинхронном режиме.

Это хорошо работает в 99% случаев ... но в 1% случаев запрос, кажется, никогда не завершается, и поэтомуоперация просто ждет вечно.

Последовательность вызовов API для зависшего файла:

#   Time of Day Relative Time   Thread  Module  Category    API Return Value    Error   Duration
1160    4:14:50.142 PM  0:00:00:308 1   ghc-stage2.exe  File Management CreateFileW ( "\\?\<path>\llvm-targets", GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN, NULL )    0x00000000000001f0      0.0001230
1173    4:14:50.143 PM  0:00:00:309 1   ghc-stage2.exe  File Management CreateIoCompletionPort ( 0x00000000000001f0, 0x00000000000001e4, 496, 0 )   0x00000000000001e4      0.0000407
1179    4:14:50.143 PM  0:00:00:309 1   ghc-stage2.exe  File Management GetFileType ( 0x00000000000001f0 )  FILE_TYPE_DISK      0.0000039
1190    4:14:50.143 PM  0:00:00:309 1   ghc-stage2.exe  File Management SetFileCompletionNotificationModes ( 0x00000000000001f0, 3 )    TRUE        0.0000075
1224    4:14:50.144 PM  0:00:00:310 1   ghc-stage2.exe  Error Handling  GetLastError (  )   ERROR_IO_PENDING        0.0000009
1223    4:14:50.143 PM  0:00:00:309 1   ghc-stage2.exe  File Management ReadFile ( 0x00000000000001f0, 0x00000000074d7010, 8192, NULL, 0x00000000073670e0 ) FALSE   997 = Overlapped I/O operation is in progress.  0.0000811
1276    4:14:50.144 PM  0:00:00:310 5   ghc-stage2.exe  File Management GetQueuedCompletionStatusEx ( 0x00000000000001e4, 0x0000000007406340, 64, 0x0000000007367140, INFINITE, FALSE ) 

Даже при чтении файлов по одному это, кажется, происходит, и я не уверен, почему,Сначала я думал, что указатель, содержащий структуру LPOVERLAPPED_ENTRY, может стать недействительным, но проверка местоположения с помощью gdb показывает, что он все еще хорош.

(gdb) x/12w 0x0000000007406340
0x7406340:      0x00000000      0x00000000      0x00000000      0x00000000
0x7406350:      0x00000000      0x00000000      0x00000000      0x00000000
0x7406360:      0x00000000      0x00000000      0x00000000      0x00000000

Кто-нибудь знает, что может происходить?

...