彼得森的算法如何在不做出不切实际的假设的情况下工作?

希尔科特

我不明白像 Peterson 和 Lamport 这样的纯软件临界区算法是如何工作的。

维基百科列出了彼得森的这个伪代码:

flag[me] = true;
turn  = other;
while (flag[other] == true && turn == 1)
     {
         // busy wait
     }
 // critical section
 // end of critical section
 flag[me] = false;

在我看来,这在实践中是不可能的。如果另一个执行线程远远落后于flag[other]甚至没有初始化,会发生什么?

对于烘焙算法:

   Entering[i] = true;

  Number[i] = 1 + max(Number[1], ..., Number[NUM_THREADS]);

  Entering[i] = false;

  for (integer j = 1; j <= NUM_THREADS; j++) {

      // Wait until thread j receives its number:

      while (Entering[j]) { /* nothing */ }

      // Wait until all threads with smaller numbers or with the same

      // number, but with higher priority, finish their work:

      while ((Number[j] != 0) && ((Number[j], j) < (Number[i], i))) { /* nothing */ }

  }

如果一个线程在其他线程完成上面的初始化步骤之前进入 for 循环怎么办?我错过了什么吗?

维基百科甚至说:

该算法满足解决临界区问题的三个基本标准,前提是对变量 turn、flag[0] 和 flag[1] 的更改立即以原子方式传播

这不是一个不合理的假设吗?似乎这些算法都假定了其他一些同步方式,因此其他线程不会在您执行自己的操作的过程中执行操作,但是如果我们已经拥有了,那么所有这些算法不应该给您,因为当你没有可以像LOCK指令一样为你锁定其他人的硬件时

彼得·德·里瓦兹

如果另一个执行线程远远落后于 flag[other] 甚至没有初始化,会发生什么?

您是对的:彼得森算法要求将标志初始化为零。

如果一个线程在其他线程完成上面的初始化步骤之前进入 for 循环怎么办?

面包店算法定义说数字数组的内容必须从 0 开始。

似乎这些算法都假定了其他一些同步方式,因此其他线程不会在您执行自己的操作的过程中执行操作

事实上,面包店算法令人惊讶地没有这些假设。例如,维基百科文章声称:

每个线程只写自己的存储,只有读取是共享的。值得注意的是,该算法不是建立在一些较低级别的“原子”操作之上,例如比较和交换。原始证明表明,对于同一存储单元的重叠读取和写入,只有写入必须是正确的。读取操作可以返回任意数字。因此,该算法可用于在缺少同步原语的内存上实现互斥,例如,两台计算机之间共享的简单 SCSI 磁盘。

确实,它们依赖于从初始化值开始的共享值,但根据我的经验,这从未引起过问题。例如,大多数多线程进程作为一个单独的线程开始,它会分叉其余的线程,因此如果所有初始化都是静态完成的,或者在其他线程启动之前完成,就不会有问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有statsmodel ARIMA的不切实际的均方误差

不切实际的不合理“错误替换”

WebClient 连续下载产生不切实际的下载速度

为什么类型推理对于面向对象的语言不切实际?

令人困惑的,看似不切实际的Linux磁盘分区方案

令人不切实际的“条件表达式中的无效数据类型”

在顶部显示不切实际的长处理时间

能够在不切实际的时间点设置时间的目的是什么?

我正在编写嵌套的while循环,该循环越来越不切实际(> 12个嵌套循环),我该如何递归编码?

为什么Python RK23解算器会爆炸并给出不切实际的结果?

是什么导致我的骰子游戏显示出不切实际的完美掷骰数

试图了解彼得森算法

避免线程之间竞争条件的彼得森算法

彼得森算法会陷入僵局吗?

试图了解彼得森的N过程算法

彼得森算法的这种模型不正确吗?

多线程-彼得森算法不起作用

R界等待彼得森锁

为什么彼得森算法的这种简化不提供过程同步?

此函数如何在缺少参数的情况下工作

MongoDB 如何在这种情况下工作?

如何在不做出26个不同声明的情况下排除所有字母?

为什么彼得森的锁在此测试中失败?

操作系统:彼得森的解决方案

如何在不切词的情况下在中间缩写字符串

Outlook和AutoHotkey,如何在不切换字体的情况下输出Unicode符号?

XSL 1.0,如何在不切字的情况下分割字符串

SwiftUI如何在不切换标签栏的情况下刷新单个标签视图

如何在不切片的情况下对向量进行解构?