2016-07-05 62 views
1

Win32 API有一個名爲SetThreadpoolCallbackPriority()的函數(實際上是一個宏)。SetThreadpoolCallbackPriority是否適用於IO回調

我想將它用於線程池I/O回調。 documentation很少,但提到了「工作項目」。除了this blog entry之外,谷歌沒有找到很多例子,它再次談到「工作項目」。

優先級實際上是否適用於I/O?如果是的話,我該如何正確使用它?

+0

當您嘗試使用它時會發生什麼? – Marichyasana

+0

沒什麼不好發生,我只是看不到基準測試中的任何影響,因此我在問。我在創建IO之後執行SetThreadpoolCallbackPriority()以臨時增強某些客戶端的回調 –

+0

定義「IO回調」? –

回答

1

是否優先化實際上是我的工作/ O

沒有,這隻有通過調用SubmitThreadpoolWork排隊的工作項目的效果。如何在您的鏈接中注意絕對正確 -

此函數不會修改線程優先級;而是使用 分開的隊列中低,高和正常的優先工作項目

這麼叫SetThreadpoolCallbackPriority只有間接的方式通TP_CALLBACK_PRIORITY優先級參數的功能SubmitThreadpoolWork(工作)。我看起來更合乎邏輯的將是這樣做的直接和旁邊的簽名 -

VOID WINAPI SubmitThreadpoolWork(
    __inout PTP_WORK pwk, TP_CALLBACK_PRIORITY Priority 
); 

比較這與下一個功能 - IoQueueWorkItem - 在SetThreadpoolCallbackPriority它用戶模式模擬和參數WORK_QUEUE_TYPE QueueType - 像TP_CALLBACK_PRIORITY優先 - 說隊列(存在3個不同的隊列)插入工作項目。對於I/O項目,這當然沒有任何影響。當工作線程刪除項目 - 它首先從高優先級刪除它,實用它不是空的,然後從正常,最後從低

+0

謝謝!如果這不起作用,那將是可惜的。不知道線程池實現的內部情況,但我可以想象,如果它使用GetQueuedCompletionStatusEx成批分發OVERLAPPED,它可以對出隊IO進行一些優化。我剩下的唯一選擇是將出列項目轉換爲優先級排序的工作隊列,而不是直接在它到達的線程中處理它,對嗎? –

+0

不,當IO隊列剛剛調用時,您需要哪些IO項目的優先級? – RbMm

+0

這很容易解釋。想象一下,這是在一個數據庫服務器內部,我知道這個客戶端連接持有一些其他連接正在等待的重要鎖,直到當前事務結束。所以我想要增強這種連接,使其更快地完成,而不是讓其他連接等待鎖 –

相關問題