Process 为什么wait()和signal()信号量操作需要是原子的?
我正在读中的同步章节。在第215页,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) {
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()需要是互斥原子