Assembly 禁用中断如何解决关键部分问题?

Assembly 禁用中断如何解决关键部分问题?,assembly,concurrency,kernel,interrupt,Assembly,Concurrency,Kernel,Interrupt,我正在阅读一些类似这样的代码的课堂讲稿,但我并不真正理解为什么禁用中断可以解决并发性问题。如果有两个线程在运行,第一个线程调用CLI()以禁用中断,然后进入临界部分。这如何阻止第二个线程调用increment(x),调用CLI(),然后也进入critical部分 在我的理解上似乎有一些差距——第二个线程运行需要中断吗?CPU何时切换到运行不同的线程 void increment(int &x) { CLI(); // critical section int t

我正在阅读一些类似这样的代码的课堂讲稿,但我并不真正理解为什么禁用中断可以解决并发性问题。如果有两个线程在运行,第一个线程调用CLI()以禁用中断,然后进入临界部分。这如何阻止第二个线程调用increment(x),调用CLI(),然后也进入critical部分

在我的理解上似乎有一些差距——第二个线程运行需要中断吗?CPU何时切换到运行不同的线程

void increment(int &x) {
    CLI();

    // critical section
    int temp = x;
    temp = temp + 1;
    x = temp;

    STI(); 
}

假设只有一个处理器,或者线程总是在同一个处理器上运行,那么确实需要一个中断来从一个线程的执行上下文切换到另一个线程。环0中的true
cli
指令将避免另一个线程运行的可能性。(NMI仍然可以发生,但操作系统可以确保从不从NMI切换线程上下文。)但是,如果使用多处理,这是不够的。