2016-11-15 142 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; 
}