我們編寫了利用I/O完成端口的軟件,並在SOCKET對象上使用WSASend,在命名管道上使用WriteFile。IOCP:內核如何決定同步或異步完成WSASend?
在這兩種情況下,我們發現這些API比我們預期的要早得多地返回SOCKET_ERROR/WAS_IO_PENDING [1](或命名管道WriteFile操作的等價物)。
看來我們錯誤地認爲,如果填充發送緩衝區(CreateNamedPipe中的nInBufferSize),會觸發異步完成,相反,它看起來更具侵略性,與發送緩衝區的大小無關。對於套接字和命名管道,如果速度足夠快,則在第二次寫入時,一個大型發送緩衝區(100k +)和小型消息(幾個字節)將始終以異步方式完成。
任何人都可以證實這一點嗎?有沒有人有關於啓發式方面的信息,即Windows實現在決定何時異步完成I/O操作時,與做同步完成時相比?
[1]「如果重疊操作成功啓動並稍後完成,則WSASend返回SOCKET_ERROR並指示錯誤代碼WSA_IO_PENDING。」 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms742203(v=vs.85).aspx
此類實現細節可能會有所變化。你需要確保你的代碼不包含任何關於它們的假設。 – 2014-11-03 02:49:37