一个线程可以在关键部分的中间被抢占吗?

时间:2016-05-27 22:22:49

标签: .net c windows multithreading clr

通过在Windows中禁用中断,是否可以实现关键部分锁定?如果是这种情况,那么当一个线程位于关键部分的中间时,它就不能被抢占。

但是如果是这种情况,即如果在执行关键部分时线程无法被抢占,则会使脉冲监视器的整个点不如在某个时候那么重要。即使它处于关键部分的中间,也可以要求线程撤离CPU。

所以,我真正的问题是:

  1. 如何在Windows中实施监视器?

  2. 线程在关键部分中间是否可被抢占?

2 个答案:

答案 0 :(得分:6)

Windows的设计使线程即使在内核模式下运行are always preemptible and always interruptible。因此,关键部分肯定不会通过禁用中断来实现,也不会阻止抢占。

实际上,如果用户模式线程可以阻止中断和/或抢占,那么用户模式进程无意中崩溃整个系统将是微不足道的。因此,没有现代操作系统按照您的建议行事。

在Windows中,monitors are usually implemented using condition variables,由线程调度程序作为基元提供。我相信POSIX也是如此。

答案 1 :(得分:2)

根据this关键部分块不禁用中断。关键部分和互斥体之间的唯一区别是关键部分仅在同一过程的上下文中有效。因此它们不能用于同步不同的进程。其他线程可以继续运行,甚至不会禁用中断。只有当第一个线程仍在使用它时,其他线程才会进入相同的临界区。

此外,即使禁用了中断,其他线程也可以在现代硬件上运行,因为现在大多数CPU都是多核。这些天真的很难找到单核CPU。对于多个内核,多个线程可以并行运行而不会相互抢占。