2016-11-15 145 views
3

我的作業是執行等待和信號在一個菱形圖案的信號量數組。信號量作爲鑽石

下面是模式:

08 
    06 07 
03 04 05 
    01 02 
    00 

Thread #08 cannot join the diamond until threads #06 and #07 are both in position. 
Thread #07 cannot join until threads #04 and #05 are both in position. 
Thread #06 cannot join until threads #03 and #04 are both in position. and so on... 

到目前爲止,我的思想已經取得了以下醜陋的算法:

if (me==0) { 
     wait_sem (tCount[1]) ; 
     wait_sem (tCount[2]) ; 
     signal_sem (tCount[0]) ; 
    } 
    if (me==1) { 
     wait_sem (tCount[3]) ; 
     wait_sem (tCount[4]) ; 
    } 
    if (me==2) { 
     wait_sem (tCount[4]) ; 
     wait_sem (tCount[5]) ; 
    } 
    if (me==3) { 
     wait_sem (tCount[6]) ; 
    } 
    if (me==4) { 
     wait_sem (tCount[6]) ; 
     wait_sem (tCount[7]) ; 
    } 
    if (me==5) { 
     wait_sem (tCount[7]) ; 
    } 
    if (me==6) { 
     wait_sem (tCount[8]) ; 
    } 
    if (me==7) { 
     wait_sem (tCount[8]) ; 
    } 

是否有這樣做的清潔方法?我聽說switch,但我從來沒有使用過,所以如果有人建議,請給我一個解釋和例子。非常感謝所有的投入。

回答

3

讓我們採取一種非常簡單的方法,將信號量保存在全局數組中(或者只是簡單地訪問您的線程)。您可以設置這樣的依賴列表:

std::vector<std::vector<int>> thread_depends = { 
    { },  // 0 
    { 0 }, // 1 
    { 0 }, // 2 
    { 1 }, // 3 
    { 1, 2 }, // 4 
    { 2 }, // 5 
    { 3, 4 }, // 6 
    { 4, 5 }, // 7 
    { 6, 7 }, // 8 
}; 

現在,每個線程只需要在一切等待在thread_depends[me]

const auto & dep = thread_depends[me]; 
std::for_each(dep.begin(), dep.end(), [&tCount](int who){ wait_sem(tCount[who]); }); 
signal_sem(tCount[me]); 

這種方法的好處是,你不重複對每種情況做什麼的邏輯。相反,你只是表示依賴關係,而你只有一段代碼來完成實際的工作。這意味着製作複製粘貼錯誤的可能性較小。

+1

快速的問題,我會將這個代碼包含在涉及算法的函數中,還是我應該把它放到全局訪問? – Junikin

+0

很難快速回答這個問題。 – paddy

+0

好的,我明白了。那麼我會玩一下。非常感謝 – Junikin

1

該解決方案僅用於展示如何使用大小寫來完成此問題,還有更好的實現方案!

開關比,如果是更好/別的,因爲它可以作爲一個跳時,如果公司將需要測試的所有條件,直到其滿意(IF0,IF1,IF2 ...),交換機將直接向正確的情況下。

switch(me) 
{ 
    case 0: 
     wait_sem(tCount[1]); 
     wait_sem(tCount[2]); 
     signal_sem(tCount[me]); 
     break; 
    case 1: 
     wait_sem(tCount[3]) ; 
     wait_sem(tCount[4]) ; 
     signal_sem(tCount[me]); 
     break; 
    case 2: 
     wait_sem(tCount[4]); 
     wait_sem(tCount[5]); 
     signal_sem(tCount[me]); 
     break; 
    case 3: 
     wait_sem(tCount[6]); 
     signal_sem(tCount[me]); 
     break; 
    case 4: 
     wait_sem(tCount[6]); 
     wait_sem(tCount[7]); 
     signal_sem(tCount[me]); 
     break; 
    case 5: 
     wait_sem(tCount[7]); 
     signal_sem(tCount[me]); 
     break; 
    case 6: 
     wait_sem(tCount[8]); 
     signal_sem(tCount[me]); 
     break; 
    case 7: 
     wait_sem(tCount[8]); 
     signal_sem(tCount[me]); 
     break; 
    case 8: 
     signal_sem(tCount[me]); 
     break; 
}