2011-06-30 57 views
0

我在等待列表中有n個任務。 每個任務都有與之相關聯的,它包含了一些元數據信息的條目:如何根據一些關聯的元數據從列表中選擇任務?

Task1 A,B
Task2 A
Task3 B,C
Task4 A,B,C

和包含像條目的asssociated的HashMap:

A 1 
B 2 
C 2 

這意味着,如果一個任務,包含在其元信息A已經在運行,則不能同時運行包含 A的其他任務。 但是,由於B具有2個任務的限制,因此任務1和任務3可以一起運行,也可以運行任務3和任務4。 但是task1,task3和task4不能同時運行,因爲A和B的限制都會被違反,儘管C的限制並不違反 。

如果我需要選擇在不同的線程中運行的任務,你會建議什麼邏輯/算法?而且,何時應該調用這個邏輯 ?我將任務列表視爲共享資源,當從中選擇任務 時,可能需要將其鎖定。現在,我認爲當任務被添加到列表中時可能必須調用此邏輯,並且在正在運行的任務完成時也可以調用此邏輯。但是這可能會阻止向列表中添加新元素,除非在運行邏輯之前創建列表副本。

如果我給予比A,B,C' 含有更多條目的任務的優先級高於'A,B',那麼您的邏輯將如何改變?

這是Choosing a data structure for a variant of producer consumer problemHow to access the underlying queue of a ThreadpoolExecutor in a thread safe way的延續,以防萬一任何人想知道問題的背景。

回答

0

是的,這是討厭的。我立即想到了一個數組/信號量列表,從散列圖初始化,任何嘗試執行任務的線程都必須根據這些元數據定義單元。大約一秒鐘後,我意識到這樣的設計會很快死鎖!

我認爲一個專用的生產者線程將不得不遍歷一個'readyJobs'列表,試圖找到一個可以使用當前資源執行的任務。它可以在新任務變得可用時和任務完成後這樣做,釋放資源。生產者線程可以在一個輸入隊列(線程安全的生產者 - 消費者隊列)上等待,其中[任何地方]的兩個新任務都被排隊,並且完成從工作線程排隊的任務(工作線程觸發的回調將完成的任務推送到輸入隊列?)。添加新任務可能會暫時被阻止,但僅當輸入隊列被添加的其他任務阻塞時。

在分配'priorites'的情況下,您可以根據需要插入'readyJobs'列表,以便首先檢查更高優先級的任務以查看它們是否可以使用可用資源運行。如果他們不能,那麼列表的其餘部分將被迭代,而低優先級的作業可能會運行。

我希望你不想「搶佔」低優先級的任務,以便提前釋放資源 - 這將得到真的,真的凌亂:(

RGDS, 馬丁

+0

我剛纔讀的鏈接到您的所有其他要求:(( –

+0

儘管如此,我仍然會用專用生產線接近這一點,所以順序訪問邏輯,並消除對明確的鎖的需要。如果生產商(或任何其他線程),想要一個。準備/ INPROGRESS列出的快照,它可以排隊了它的請求,(與請求內的事件等待),生產者輸入隊列,與所有其他的東西一起。生產者日然後讀取可以向請求添加它管理的ready/inProgress隊列數據的快照(複製),然後發信號通知事件。這避免了複雜的鎖定方案(即間歇性死鎖)。 –

相關問題