2013-01-21 35 views
5

在Windows下,有兩種方法插入工作項以避免創建太多線程:I/O完成端口與QueueUserApc?

方法1:使用IOCP;

手段2:使用QueueUserApc。

然而,意味着1遠遠比複雜的裝置2

所以我的問題是:什麼是1個相對於手段的裝置2的優勢是什麼?

回答

7

當您致電QueueUserApc時,您必須以特定線程爲目標。

IOCP有一個內置的線程調度機制,QueueUserApc缺少允許您將線程池中最高效的線程作爲目標。線程調度機制可以自動防止同時運行太多的線程(這會導致額外的上下文切換和額外的爭用),或者同時運行的線程太少(這會導致性能下降)。

Windows實際上跟蹤運行IOCP作業的線程數。它最初設置允許運行的線程數等於機器上虛擬內核的數量。但是,如果某個線程阻塞了I/O或同步,則IOCP端口上阻塞的另一個線程會自動釋放,從而避免線程匱乏。

此外,IOCP可以很容易地連接到I/O,以便I/O事件觸發在IOCP端口上阻塞的線程派發。這是對Windows上的大量目標進行I/O操作的最有效方式。

+0

+1。好的答案。注意:第二段直接導致你是允許的「正在運行」線程的數量的原因,並且「可運行」線程池的實際大小可能明顯不同。操作系統通過等待狀態檢測爲你做內部調度的能力非常驚人,並且不能被誇大。 – WhozCraig

+0

@WhozCraig:我同意。我很驚訝其他操作系統沒有采用類似的調度機制。雖然其他操作系統具有出色的I/O發現機制(如Linux的[epoll](http://en.wikipedia.org/wiki/Epoll)和FreeBSD的[kqueue](http://en.wikipedia.org/wiki/) Kqueue)),我不知道有任何其他操作系統具有可比較的調度機制,更不用說直接綁定到I/O發現/通知機制的操作系統。 –