Process 为什么wait()和signal()信号量操作需要是原子的?

Process 为什么wait()和signal()信号量操作需要是原子的?,process,synchronization,semaphore,mutual-exclusion,Process,Synchronization,Semaphore,Mutual Exclusion,我正在读中的同步章节。在第215页,wait()和signal操作的定义如下: wait(semaphore *S) { S->value--; if (S->value < 0) { add this process to S->list; block(); } } signal(semaphore *S) { S->value++; if (S->value <= 0) {

我正在读中的同步章节。在第215页,wait()和signal操作的定义如下:

wait(semaphore *S) {
    S->value--;
    if (S->value < 0) {
        add this process to S->list;
        block();
    }
}

signal(semaphore *S) {
    S->value++;
    if (S->value <= 0) {
        remove a process P from S->list;
        wakeup(P);
    }
}
wait(信号量*S){
S->值--;
如果(S->值<0){
将此流程添加到S->list中;
block();
}
}
信号(信号量*S){
S->value++;
如果->值列表;
唤醒(P);
}
}
然后声明:

以原子方式执行信号量操作是至关重要的 必须保证没有两个进程可以执行wait()和signal() 同时对同一信号量执行操作

因此,同时执行wait()和signal()的两个进程可能会以某种方式打破互斥

我不确定什么样的调用序列可以说明它们是原子的。我觉得这与
S->value
保持不变有关,如果我们首先调用信号,中断等待,然后中断返回信号。这可能会以某种方式导致不应该被唤醒的进程被唤醒

我需要一个例子来说明为什么wait()和signal()需要是互斥原子