来自编程语言语用学,由Scott
同步可以通过旋转实现(也称为 忙着等待或者阻止。
在忙等待同步中,线程运行一个循环,它保持循环 重新评估某些条件,直到该条件成立为止(例如, 直到消息队列变为非空或共享变量达到 特别值) - 可能是其他一些行动的结果 线程,在其他核心上运行。
在阻止同步(也称为基于调度程序的同步)中, 等待线程自愿放弃其核心到其他线程。在此之前,它会在与同步相关的某些数据结构中留下注释 条件。在将来的某个时刻使条件成立的线程将会 找到注释并采取措施使被阻止的线程再次运行。
为什么这种同步机制称为“阻塞”?
谁阻止谁?
感谢。
答案 0 :(得分:1)
Busy-waiting会导致多个不必要的上下文切换,因为进程/线程会反复尝试进入循环中的临界区,因此需要花费很多CPU时间。
阻止同步通过具有进程/线程块来避免此问题。它将被放入等待队列,而不是试图获得CPU时间,进程/线程只是空闲等待。阻塞的进程/线程不会浪费CPU周期,因此其他进程/线程可以继续而不会产生不必要的共享周期。一旦某个其他进程/线程释放了一个关键部分,就会唤醒阻塞的进程/线程。
所以这就是为什么这个同步机制叫做阻塞,它会被阻塞或者再也无法获得cpu,其他人就释放了锁。
谁阻止了它?我会说机制是这样做的。它将没有获取锁的线程/进程放入队列中等待,并且有一些像监视器来监视锁,一旦锁被释放,它将从阻塞的队列中检索一个。
答案 1 :(得分:1)
为什么[它]被称为"阻止"?
想想自己开车去奶奶家吃感恩节晚餐,当你遇到一个意外的场景时:拖车操作员正在挂着一辆横跨整条道路的大卡车。收音机里的交通记者说,"它阻挡两条车道。"您可能会说事故是阻止。
谁阻止谁?
就像你引用的文字所说的那样,它是自愿的。当你遇到事故现场时,你可以转身找到一种不同的方式,但是根据迂回的时间长短,以及它看起来多久它们会让卡车驶向路边,你可以自愿坐下来等待。
软件通常坐着等待。编写等待的软件更容易,并且更容易阅读和理解它。那种不坐着等待的软件称为wait free algorithm,写起来非常棘手。