我的作业是把信号灯组织成金字塔。任务已经完成了,但我最终得到了一个长期丑陋的条件,我想知道是否有人能看到一个更好的方法/算法来完成同样的事情。
if (me==0) {
wait_sem(semaphore[1]);
wait_sem(semaphore[2]);
signal_sem(semaphore[0]);
}
if (me==1) {
wait_sem(semaphore[3]);
wait_sem(semaphore[4]);
}
if (me==2) {
wait_sem(semaphore[4]);
wait_sem(semaphore[5]);
}
if (me==3) {
wait_sem(semaphore[6]);
wait_sem(semaphore[7]);
}
if (me==4) {
wait_sem(semaphore[7]);
wait_sem(semaphore[8]);
}
if (me==5) {
wait_sem(semaphore[8]);
wait_sem(semaphore[9]);
}
if (me==6) {
wait_sem(semaphore[10]);
wait_sem(semaphore[11]);
}
if (me==7) {
wait_sem(semaphore[11]);
wait_sem(semaphore[12]);
}
if (me==8) {
wait_sem(semaphore[12]);
wait_sem(semaphore[13]);
}
if (me==9) {
wait_sem(semaphore[13]);
wait_sem(semaphore[14]);
}
发布于 2013-11-01 01:17:46
我甚至不会在这里使用switch
:
wait_sem(semaphore[me*2+1]);
wait_sem(semaphore[me*2+2]);
if (me==0) {
signal_sem(semaphore[0]);
}
编辑:我看到序列不是很线性的。如果您能够在me
和索引之间找到一个简单的映射,这将有效(但使用不同的公式)。否则,switch
语句可能是最简单的方法。
您还可以通过将输入的ints映射到两个索引( switch
)来将std::map<int, std::pair<int, int> >
隐藏在映射中。它本质上做了同样的事情,但是您可以在头文件中隐藏丑陋的内容。
发布于 2013-11-01 00:39:46
在这种情况下,开关语句是非常有用的。它们也比您的系列if
语句更高效,这些语句必须检查所有语句,即使在找到要查找的语句之后也是如此。switch
将立即分支到正确的一个,并跳过所有其他的。这有用吗?
switch(me)
{
case 0:
wait_sem(semaphore[1]);
wait_sem(semaphore[2]);
signal_sem(semaphore[0]);
break;
case 1:
wait_sem(semaphore[3]);
wait_sem(semaphore[4]);
break;
//etc.
}
发布于 2013-11-01 01:38:36
你总是等待两个信号量,有时发出一个信号量。通过计算要等待的信号量的索引,可以缩短代码:
assert(me >= 0);
if (me < 10) {
// Find the unique n s.t. T_n <= me < T_{n+1} where {T_n}_n are the triangular numbers
int n = (int)(0.5 * (sqrt(1+8*me)-0.99));
// then calculate nextPos := me + (T_{n+1} - T_n)
int nextPos = me + n + 1;
wait_sem(semaphore[nextPos]);
wait_sem(semaphore[nextPos + 1]);
}
if (me == 0) {
signal_sem(semaphore[0]);
}
https://codereview.stackexchange.com/questions/33626
复制相似问题