2010-07-19 55 views
0

在作業/任務池中使用iocp以提供快速工作人員喚醒時,最小化端口信號開銷的最佳方式是什麼?即不必每次都執行隊列操作?在作業池中使用iocp

void Worker() { while(1) { for(int spin = 0; spin < 5000; ++spin) while(queue.Count > 0) queue.PopFront()();

WaitOnCompletionPort(); 
} 

}

...

queue.PushBack(someWork); // decide when to signal completion port but avoid doing it every queue operation ?

例如在上面的代碼粗糙的草圖有工作正在排隊,如果你儘量避免信號端口每個隊列操作而進入等待之間的問題。

回答

1

爲什麼不使用IOCP作爲您的隊列並直接發佈您的工作項目?這樣你可以免費得到一個線程安全隊列,並可以完全刪除你擁有的其他隊列?

那麼這個問題就會自行消失;)

+0

其實是因爲我與推動工作項目到隊列中,所以我試圖避免信號的端口,每個工作項目的一個可能更有效的方法進行實驗。 – iam 2010-07-20 08:32:41

+0

不夠公平,爲什麼不完全移除IOCP並使用信號量呢?或者,保持IOCP,刪除你的自定義隊列,並查看'GetQueuedCompletionStatusEx()'一次刪除多個完成進行處理。 – 2010-07-20 09:10:54

+0

據我所知,IOCP比信號量更高效和可擴展。 我只希望每個工作線程一次性竊取一項工作 - 因爲它一次只能運行一項任務/工作。問題在於決定何時在工作線程端口可能開始入睡之前發出信號。 – iam 2010-07-20 10:14:09