2012-03-27 4 views
1

Gemäß http://support.microsoft.com/kb/156932 können Aufrufe von ReadFile synchron erscheinen, wenn bestimmte Bedingungen erfüllt sind. Zum Beispiel, wenn die Zieldatei NTFS komprimiert ist. Der Artikel sagt nichts darüber aus, was passiert, wenn das Datei-Handle einem IOCP zugeordnet wird.Was passiert mit Win32 IO Completion Port und synchron erscheinendem IO?

Was passiert in diesem Fall, wenn das Dateihandle mit einem IOCP verknüpft ist? Erhalte ich noch IO-Completion-Pakete für diese Anfrage oder wird die Anfrage komplett synchron durchgeführt?

Wenn ja, muss ich den gesamten ReadFile-Aufruf in einen Worker-Thread einfügen. Der Thread, der den ReadFile-Aufruf zu Beginn absetzt, darf nicht blockieren. Der Grund, warum ich IOCP in Erwägung ziehe, liegt darin, dass das Umsetzen des ReadFile-Aufrufs in einen Worker-Thread einen Kontextwechsel zum Worker-Thread bedeutet, der unmittelbar danach auf ReadFile blockiert.

Antwort

2

Jede überlappende Operation, die mit ERROR_SUCCESS ODER mit ERROR_IO_PENDING abgeschlossen wird, generiert ein Completion-Paket. Siehe tip 4 of this knowledge base article.

Dies setzt voraus, dass Sie FILE_SKIP_COMPLETION_PORT_ON_SUCCESS auf dem fraglichen Griff nicht aktiviert haben, indem Sie SetFileCompletionNotificationModes() verwenden. Wenn Sie FILE_SKIP_COMPLETION_PORT_ON_SUCCESS aktiviert haben, werden Vorgänge, die mit ERROR_SUCCESS abgeschlossen werden, kein Abschlusspaket generieren, und Sie sollten Abschlussverarbeitung an dem Punkt ausführen, an dem Sie die überlappende Operation abgesetzt haben.