2012-11-01 18 views
5

我對IO完成端口完成時實際發生的事情感到有點困惑。在完成端口有什麼要報告之前或之後,IO完成端口是否產生新的線程?

我猜想贏API允許訪問的IOCP隊列,不知怎的,能夠隊列(或堆棧)與特定的手柄回調引用(比方說,一個插座)。 當Windows在某些時候接收來自NIC的中斷,那麼它到達IOCP隊列網卡和其自己(IOCP)線程池執行回調。

我的問題是,該線程是從接收到中斷時產生的線程池中產生的,還是實際上在調用Win API時產生的線程,實際上等待線程處於等待狀態由IOCP隊列喚醒?

編輯:
我發現這一點:http://msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-i-o-and-the-thread-pool.aspx哪裏是狀態:「每當操作完成後,將隊列I/O完成端口的數據包則端口將繼續,並且使用線程之一。池的線程來運行你指定的回調。「

+0

只是爲了說明問題,這是一個關於重疊IO如何管理事件通知*事件*接收到IOCP用戶管理線程池的問題,是否正確? – WhozCraig

+0

不是。這是一個關於是否在端口有一些IO(在這種情況下它們被阻塞)之前創建IOCP創建的線程的問題,或者在端口有一些IO要報告時創建的線程。 – kasperhj

+0

這是不是很清楚你在說什麼。中斷由驅動程序處理。重要的是你的代碼使用GetQueuedCompletionStatus()還是後面的CreateThreadPoolIo()。在第一種情況下,你創建了tp線程。在最後一種情況下,Windows在重疊的I/O完成時創建它。 –

回答

5

將I/O完成端口簡單地視爲線程安全隊列可能會更容易,操作系統在完成時將重疊操作的結果放入您的系統中。

您創建IOCP,然後創建一些線程,這些線程調用一個函數來從隊列中刪除項目。通常這是GetQueuedCompletionStatus()。這個函數基本上阻塞你的線程,直到IOCP(隊列)中有東西,然後允許你的線程檢索並運行。

您關聯的文件句柄,並與IOCP插座,這只是意味着,一旦相關的重疊的落成將被放置在IOCP(隊列)爲您服務。

這是比這更復雜,但是這是你應該考慮的方式。

+0

只是爲了澄清。在我的應用程序中,我創建了我的_own_線程池,並將線程池線程傳遞給IOCP,然後IOCP將其阻塞,直到完成某個任務?這很難理解,因爲對這種實際工作方式有不同的「意見」,例如,看我的編輯。 – kasperhj

+0

您池中的線程將阻止IOCP等待工作,其他一切與我的答案中所述相同。池如何決定改變它保存的線程數與IOCP沒有任何關係。它可能能夠監視其線程什麼時候調用GetQueuedCompletionStatus(),如果當前沒有,並且一些超時到期,則它可以創建更多線程,然後它們將阻塞IOCP等待工作。我不知道線程池的實現,所以我不能再說了。 –

+0

假設我在UI線程上調用IOCP,它會阻塞,直到我得到我的IOCP數據包?你有沒有參考IOCP內部? – kasperhj

相關問題