谁阻止谁阻止同步?

时间:2017-08-29 14:57:00

标签: multithreading concurrency synchronization programming-languages

来自编程语言语用学,由Scott

  

同步可以通过旋转实现(也称为   忙着等待或者阻止。

     

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

     

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

为什么这种同步机制称为“阻塞”?

谁阻止谁?

感谢。

2 个答案:

答案 0 :(得分:1)

Busy-waiting会导致多个不必要的上下文切换,因为进程/线程会反复尝试进入循环中的临界区,因此需要花费很多CPU时间。

阻止同步通过具有进程/线程块来避免此问题。它将被放入等待队列,而不是试图获得CPU时间,进程/线程只是空闲等待。阻塞的进程/线程不会浪费CPU周期,因此其他进程/线程可以继续而不会产生不必要的共享周期。一旦某个其他进程/线程释放了一个关键部分,就会唤醒阻塞的进程/线程。

所以这就是为什么这个同步机制叫做阻塞,它会被阻塞或者再也无法获得cpu,其他人就释放了锁。

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

答案 1 :(得分:1)

  

为什么[它]被称为"阻止"?

想想自己开车去奶奶家吃感恩节晚餐,当你遇到一个意外的场景时:拖车操作员正在挂着一辆横跨整条道路的大卡车。收音机里的交通记者说,"它阻挡两条车道。"您可能会说事故是阻止

  

谁阻止谁?

就像你引用的文字所说的那样,它是自愿的。当你遇到事故现场时,你可以转身找到一种不同的方式,但是根据迂回的时间长短,以及它看起来多久它们会让卡车驶向路边,你可以自愿坐下来等待。

软件通常坐着等待。编写等待的软件更容易,并且更容易阅读和理解它。那种坐着等待的软件称为wait free algorithm,写起来非常棘手。