1

从编程语言语用,由Scott谁阻止谁阻止同步?

同步可以通过旋转(也称为 忙等待)或通过阻断来实现。

在忙等待同步,一个线程运行循环,其中它保持 重新评估一些条件,直到该条件为真(例如,直到 消息队列非空变或共享变量达到一个特定 值)-presumably作为一些其他 线程的行动的结果,在其他一些核心上运行。

阻止同步(也称为基于调度程序的同步), 等待线程自愿放弃其核心到其他线程。在这之前,它会在与同步条件相关的某个数据结构中留下一个注释。在未来的某个时间点使条件成立的线程将会找到笔记并采取措施使被阻塞的线程再次运行。

这个同步机制为什么叫做“阻塞”?

谁阻止谁?

谢谢。

回答

1

繁忙等待会导致多个不必要的上下文切换,因为进程/线程反复尝试在循环中进入临界区,因此耗费CPU时间。

阻塞同步通过拥有进程/线程块来避免此问题。它将被放入一个等待队列中,而不是试图获得CPU时间,进程/线程只是简单地等待。没有CPU周期被阻塞的进程/线程浪费,所以其他进程/线程可以继续而不会不必要地共享周期。一旦某个关键部分被其他进程/线程释放,某些东西会唤醒被阻塞的进程/线程。

所以这就是为什么这个同步机制叫做阻塞,它会被阻塞或者不能再获取CPU,这个锁被别人释放。

谁封锁了它?我会说这个机制做到了。它把没有得到锁的线程/进程放入队列中等待,并且有监视器来监视锁,一旦锁被释放,它将从被阻塞的队列中检索一个。

1

为什么[它]被称为“阻塞”?

想想你自己开车去奶奶家吃感恩节晚餐的时候,当你出现一个事故现场时:拖车操作员正在连接一辆横跨整条路的大卡车。广播上的交通记者说,“这是阻止双线。”你可能会说,你的方式是被事故阻止了

谁阻止谁?

就像你引用的文字说的那样,这是自愿的。当你出现在事故现场时,你可以转身寻找另一种方式,但取决于绕道的时间长短以及看起来他们将卡车驶离道路一侧的时间,你可能会自愿坐下来等待。

软件通常坐等待。编写等待的软件比较容易,而且它更易于阅读和理解。那种不是而是坐等的软件叫做wait free algorithm,而且它们可能非常难以书写。