2010-08-21 61 views
0

我有一個使用鎖池實現的用pthread編寫的簡單線程池,所以我知道哪些線程可用。每個線程也有一個它等待的條件變量,所以我可以指示它做功。如何使鎖在另一個由另一個線程設置的線程中釋放

當工作進入時,我通過查找鎖池中的可用線程來選擇一個線程。然後,我設置一個與線程相關的數據結構,該線程包含它需要做的工作,並在線程應該開始工作的條件變量上發出信號。

問題是線程完成工作時。我需要解鎖鎖池中的線程,以便進行更多工作。但是,控制線程是設置鎖的線程,所以線程本身不能釋放此鎖。 (並且控制線程不知道什麼時候工作完成。)

有什麼建議嗎?

我可以重新構建我的線程池以使用一個隊列,在添加工作時所有線程都會發出信號,以便一個線程可以抓取它。但是,將來,線程關聯可能會成爲傳入工作的問題,並且鎖池會使執行更容易。

+0

使用並行線程API可以確定特定線程的運行狀態,例如線程是否已完成工作? – 2010-08-21 22:53:56

回答

0

在我看來,你試圖同步訪問的數據是每個線程的忙/閒狀態。

因此,有一個表(數組)記錄每個線程的忙/閒狀態,並使用互斥鎖來保護對該表的訪問。任何想要檢查/更改線程狀態的線程(控制器或工作者)都需要佔用互斥鎖,但只有在狀態正在被檢查/更改時才需要保持鎖定狀態,而不是整個線程工作期間。

將工作分配給一個線程,你會怎麼做:

pthread_mutex_lock(&thread_status_table_lock); 
-- search table for available thread 
-- assign work to that thread 
-- set thread status to "busy" 
pthread_mutex_unlock(&thread_status_table_lock); 
-- signal the thread 

而當線程完成其工作,將其狀態更改回「自由」:

pthread_mutex_lock(&thread_status_table_lock); 
-- set thread status to "free" 
pthread_mutex_unlock(&thread_status_table_lock); 
+0

這基本上回答了我的問題。我意識到我在實施我的游泳池方面存在根本性缺陷。我不應該爲池中的每個項目設置一組鎖,而應該有一個鎖,然後是一組狀態變量。這也可能更有效率。 謝謝! – 2010-08-22 02:13:14

相關問題