修改Peterson算法

时间:2014-03-08 13:00:52

标签: c multithreading concurrency semaphore mutual-exclusion

我知道Peterson Algo的默认实现。提供了我 - 相互排斥,进步和有限等待。

正常的彼得森算法在下面。

bool flag[0]   = false;
bool flag[1]   = false;
int turn;

P0: flag[0] = true;
    turn = 1;
    while (flag[1] && turn == 1)
    {
        // busy wait
    }
    // critical section
    ...
    // end of critical section
    flag[0] = false;


P1: flag[1] = true;
    turn = 0;
    while (flag[0] && turn == 0)
    {
        // busy wait
    }
    // critical section
    ...
    // end of critical section
    flag[1] = false;

我希望对此版本进行一些修改。

1)处理P0中的语句flag [0] = TRUE和flag [0] = FALSE被交换,并且在处理P1中进行类似的改变。 这个算法会为我提供 - 相互排斥,进步和有限的等待。 - 我觉得这个算法不会支持互斥。任何人都能为我提供更多信息吗?

2)Peterson解决方案中的语句while(flag [1]&& turn = 1)变为while(flag [1]或turn = [1]),并在过程P1中进行类似的更改。最终系统违反了关键部分的哪些属性?为什么? - 这仍然会有相互排斥,但我怀疑进步和有限等待。任何人都能为我提供更多信息吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

参见本文

On Variations of Peterson's Mutual Exclusion Algorithm

  

摘要

     

1981年最多   两个并发的简洁版本   过程是彼得森的算法。彼得森用过   决策控制中的OR运算符。   Tanenbaum使用了彼得森的声称版本   使用AND运算符的算法   决策控制,没有重置   标志。我们证明这个AND版本导致了   彼得森原始形式的平凡化。首先   看起来插入的循环,恢复为批处理   处理。由于批处理是串行处理   顺序,这消除了相互需要   为并发设计的排除算法   流程。使用Peterson的原始OR运算符   每次运行都会像他一样重置标志   interleafed。此外,正如所料,a   彼得森控制运营商的DeMorgan产量   一个支持插入的AND版本   与彼得森的原始形式相同。然而,   这种形式显然不比原来简单   或表格。它需要三个额外的NOT   必须仍然重置运算符和标志。