[英]How to setup and manage persistent multiple threads?
我有POSIX用於實現,但這個問題更多的是關於架構。
我從一個有幾個主要工作要做的更新循環開始。 我可以將這些作業分為四個或五個具有共同內存訪問要求的主要任務。 我的想法是將這些工作分解為自己的線程並讓它們完成一個“更新”周期並一直睡到下一幀。
但是如何同步? 如果我在每個循環開始時分離四個或五個線程,讓它們運行一次,死掉,然后在每次傳遞時分離另外4-5個線程? 這聽起來很貴。
創建這些線程一次聽起來更合理,讓它們進入睡眠狀態,直到同步調用喚醒它。
這是明智的做法嗎? 我願意接受從想法到任何類型的實現的回應。
編輯:基於到目前為止的答案,我想補充:
這取決於線程正在執行的任務的粒度。 如果他們正在執行長任務(例如一秒或更長時間),那么與線程正在進行的工作相比,創建和銷毀線程的成本可以忽略不計,因此我建議保持簡單並按需創建線程。
相反,如果您的任務非常短(例如,小於10-100毫秒左右),您肯定會開始注意到創建和銷毀大量線程的成本。 在這種情況下,是的,你應該只創建一次線程並讓它們休眠直到工作到達它們。 你會想要使用某種條件變量 (例如pthread_cond_t
):線程等待條件變量,當工作到達時,你發出條件變量的信號。
最好的可能是使用任務隊列。
任務隊列可以看作是等待將作業提交給它們的線程。 如果一次發送多個,則按FIFO順序執行。
這樣,您可以維護4-5個線程,並且每個線程都執行您為其提供的作業,而無需為每個作業分離新線程。
唯一的問題是我不知道C中的任務隊列的許多實現。蘋果公司有Grand Central Dispatch就是這樣做的; FreeBSD也有它的實現。 除了那些,我不知道任何其他。 (不過,我看起來並不是很努力。)
如果你每個周期總是要完成同樣的工作,並且你需要在下一個周期開始之前等待所有的工作完成,那么你正在考慮正確的解決方案。
您將需要一些同步對象:“幀開始信號量”,“幀結束信號量”和“幀結束事件”。 如果每幀有n個獨立任務,則啟動n個線程,其循環看起來像這樣(偽代碼):
while true:
wait on "start of frame semaphore"
<do work>
enter lock
decrement "worker count"
if "worker count" = 0 then set "end of frame event"
release lock
wait on "end of frame semaphore"
然后,您可以運行控制器線程:
while true:
set "worker count" to n
increment "start of frame semaphore" by n
wait on "end of frame event"
increment "end of frame semaphore" by n
這適用於小n。 如果完成每個循環所需的任務數量變大,那么您可能希望使用與任務隊列耦合的線程池,這樣您就不會使用線程來淹沒系統。 但是該解決方案的復雜性更高,而線程復雜性則是敵人。
你的想法被稱為線程池。 它們存在於WinAPI,Intel TBB和Visual Studio ConcRT中,我對POSIX知之甚少,因此無法幫助您,但它們是一個具有許多理想屬性的優秀結構,例如出色的擴展,如果發布的工作可以被分手了。
但是,我不會忽略工作所需的時間。 如果你有五個任務,並且你有一個性能問題如此絕望,以至於多個線程是關鍵,那么創建線程幾乎肯定是一個可以忽略不計的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.