线程是否可以在临界区中间被抢占?

Can a thread be preempted while in the middle of a critical section?

是否可以通过在 Windows 中禁用中断来实现临界区锁定?如果是这种情况,那么当线程处于临界区中间时就不能被抢占。

但如果是这种情况,即如果一个线程在执行临界区时不能被抢占,那将使 脉冲 监视器的整个意义变得不那么重要了如果线程可以被要求撤离 CPU,即使它处于关键部分的中间,也不会如此。

所以,我真正的问题是:

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

  2. 线程在临界区中间时是否可以被抢占?

根据 this 临界区块不会禁用中断。临界区和互斥量之间的唯一区别是临界区仅在同一进程的上下文中有效。所以它们不能用于同步不同的进程。其他线程可以继续 运行ning,甚至不禁用中断。只有当第一个线程还在使用时,其他线程进入同一个临界区才会被阻塞。

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

Windows 旨在让线程,即使在内核模式下 运行,are always preemptible and always interruptible。所以临界区肯定不是通过禁止中断实现的,也没有防止抢占。

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

在Windows中,monitors are usually implemented using condition variables,由线程调度程序作为原语提供。我相信 POSIX.

也是如此