我試圖了解哪個是真的,我在多個來源中讀到 IOCP 可用于實作執行緒池,我在其執行緒中使用多個 IOCP 來進行行程間通信,我正在嘗試重新實作我的代碼以使用只有一個 IOCP 和一個執行緒池來管理我的所有行程。
我可以只使用一個執行緒并讓 IOCP 自己的內部執行緒池管理異步 I/O,還是必須使用 Threadpool 物件才能這樣做?
編輯以澄清 IOCP 是否有它自己的執行緒池,我所要做的就是將我的句柄鏈接到它并讓它管理異步 IO?還是我必須自己制作踏板?
MSDN 檔案對此不是很清楚。提前致謝
uj5u.com熱心網友回復:
IOCP 有自己的內部執行緒池嗎?
不。如果您自己創建 IOCP ( KQUEUE) - 您需要自己呼叫GetQueuedCompletionStatus[Ex]( ZwRemoveIoCompletion[Ex])。從哪個執行緒 - 完全是你的任務。所以在這里你需要自己創建一些“執行緒池”,它將是來自 IOCP 的彈出資料包并處理它。
如果您將系統 api 用于執行緒池 - 它在內部使用 IOCP,但您從不直接訪問 IOCP - 甚至無法處理它。這一切都在系統上——創建 IOCP、創建執行緒池、監聽 IOCP、呼叫回呼。在這個方案中——你自己從 IOCP 彈出資料包——注冊一些回呼——當從 IOCP 彈出資料包時系統呼叫。
例如 - BindIoCompletionCallback
將執行緒池擁有的 I/O 完成埠與指定的檔案句柄相關聯。
注意 -執行緒池擁有的 I/O 完成埠,而不是I/O 完成埠擁有的執行緒池
但是在這個 api 中 - 沒有 IOcp 句柄作為引數。默認(因為這里沒有辦法指定另一個池)系統使用的執行緒池。它是iocp。如果檔案物件在此 api 呼叫之后保存了指向 iocp 的指標并且當 I/O 完成時 - 資料包將排隊到此 iocp,系統池彈出此資料包并呼叫您的回呼。
或CreateThreadpoolIo- 執行相同的操作BindIoCompletionCallback-將執行緒池擁有的 I/O 完成埠與指定的檔案句柄相關聯。
但這里寫的不是最好的方式
創建一個新的 I/O 完成物件。
你可能認為新的 IOCP 是通過呼叫這個 api 創建的。但不是。一些用戶模式結構 - 是的,但不是新的 IOCP。物件!=這里的埠。IOCP 是每個執行緒池一個,并且只創建一次。通過這個 api。
CreateThreadpool
分配一個新的執行緒池來執行回呼。
作為此任務的一部分 - 創建一個新的 I/O 完成埠。如此間接 - 通過創建新池 - 您創建新的 IOCP(盡管從未直接訪問它)。那么你需要:
要使用池,您必須將池與回呼環境相關聯。要創建回呼環境,請呼叫 InitializeThreadpoolEnvironment。然后,呼叫 SetThreadpoolCallbackPool 將池與回呼環境相關聯。
然后您可以將此回呼環境傳遞CreateThreadpoolIo給例如。所以這個api和更舊的api之間的主要區別BindIoCompletionCallback——你可以在這里使用不是默認的執行緒池。但是在大多數情況下,我認為-行程中僅使用單個默認執行緒池。
所以一般來說 - 如果你自己創建 IOCP - 你自己需要管理它并創建專用執行緒,用于來自 IOCP 的彈出資料包 - 這就是所謂的“執行緒池”
或者您可以使用系統池。在這種情況下,您根本不會直接訪問 IOCP。盡管這可能沒有直接記錄 - 每個執行緒池僅存在一個 IOCP。如果您使用默認的僅行程執行緒池 - 您也使用單個 IOCP。如果您創建額外的執行緒池 - 間接創建額外的 IOCP。
和 IOCP - 不自行創建任何執行緒。像事件物件 - 不創建執行緒,這將等待這個事件
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409060.html
標籤:
上一篇:呼叫open時,OpenCV不會回傳錯誤,但gstreamer會
下一篇:在M1macOS上安裝Hive
