【问题标题】:3 requirements for synchronization: why does this approach not work?3 同步要求:为什么这种方法不起作用?
【发布时间】:2014-10-31 04:57:39
【问题描述】:

我正在尝试学习同步,并了解需要满足 3 个条件才能正常工作

1) 互斥 - 没有数据被破坏
2) 有界等待 - 线程不会永远什么都不做
3)正在取得进展 - 系统作为一个整体正在工作,例如不只是路过轮到谁了

我不完全理解为什么下面的代码不起作用。根据我的笔记,它具有互斥性,但不满足取得进展或有限等待。为什么?每个线程都可以做一些事情,只要现在线程崩溃,每个线程都会轮到。 以下是共享变量

int turn; // initially turn = 0
turn == i: Pi can enter its critical section

代码是

do {
  while (turn != i){}//wait
  critical section
  turn = j;//j signifies process Pj in contrast to Pi
  remainder section
} while (true);

基本上是these notes的第10张幻灯片。

【问题讨论】:

  • j 来自哪里?
  • @Thilo 另一个线程,我会编辑以使其更清晰
  • 所以每个线程都知道它的“下一个线程”?
  • @Thilo 不,所以上面的代码是从线程 Pi 的角度来看的,所以 j 只是表示轮到 Pi,它是 Pj。基本上它只是意味着另一个线程获得了锁。以上是比实际实现更多的伪代码。
  • @Thilo 这个问题现在有意义吗?

标签: multithreading language-agnostic synchronization mutex theory


【解决方案1】:

我认为重要的是,根据your notes 的幻灯片 6,这 3 条规则适用于算法的临界区,具体如下:

进度:如果没有人在关键部分并且有人想要进入, 那么那些不在其剩余部分的进程必须 能够在有限的时间内决定谁应该进去。

有限等待:最终必须让所有请求者进入关键等待 部分。

如何破解:

  • Pi 执行,其剩余部分无限期运行(对此没有限制)
  • Pj 完整运行,设置 turn:= i 所以现在轮到 Pi 运行临界区了。
  • Pi 仍在运行其剩余部分,无限期运行。
  • Pj 回到了它的临界区,但永远不会运行它,因为 Pi 永远不会回到它可以让 Pj 轮到它的点。
    • 这违反了进度规则。没有人在临界区,Pj 想进去但不能在有限的时间内决定是否可以进去。
    • 这违反了有限等待规则。 Pj 永远不会被放回临界区。

【讨论】:

  • 好的,但是考虑到其他算法,例如 Dekker 的解决方案或 Peterson 的解决方案,您不能像说剩余部分无限期运行一样轻松地破坏它们吗?你的场景有点不公平,因为它就像假设算法被破坏了一样,即存在无限循环?
  • 对非关键位的作用没有限制,因此必须考虑每种可能性。无限期的运行部分是完全可能的,并不意味着该算法以任何方式被破坏。关于您提出的解决方案,它们不能以同样的方式被打破。对于这两种算法,一旦一个进程完成了它的临界区,它就会将它的标志设置为 false,以表示它当时不想进入临界区,所以另一个进程不会停止并等待它.
【解决方案2】:

正如 Malvavisco 正确指出的那样,如果一个进程从不释放资源,则其他进程将无法访问它。这是一个无趣的案例,通常被认为是微不足道的。 (在实践中,事实证明并非如此——这就是为什么强调能够从外部管理进程的原因,例如,强制终止进程而造成的不良影响最小。)

这些幻灯片的定义实际上有点不精确。我发现这个Wikipedia page on Peterson's algorithm(幻灯片 12 上的算法 #3)更准确。具体来说:

有限等待是指“在一个进程请求进入其临界区之后,在该请求被授予之前,允许其他进程进入其临界区的次数存在界限或限制”

一些思想实验清楚地表明算法 #1(幻灯片 10)失败了。如果进程切换时间不合适,则任一进程可以进入临界区的次数没有限制。假设进程 1 执行,进入临界区,从那里开始,只有在进程 1 处于临界区时才切换到进程 2。过程 1 永远不会解释这一点。如果进程 2 正在等待,Peterson 的算法将失去进入临界区的能力(反之亦然)。

【讨论】:

  • 起初我想把它归咎于非原子操作,但后来我意识到彼得森的算法假设某些操作是原子的,因此讲座也必须假设这一点。我会假设幻灯片假设相关的共享内存变量具有原子写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多