信号量中的原子指令

Atomic instructions in semaphores

我很困惑信号量是原子的是什么意思。等待和信号的定义如下。

wait(S){
    while ( S<= 0)
        ; // Busy wait
        S--;
}


signal(S) {
    S++;
}

书上说

all modifications to the integer value of the sophomore in the wait() and signal() operations must be executed atomically. That is, when one process modifies the semaphore value, no other process can simultaneously modify the same semaphore value

这是否意味着在 while(S<=0)S-- 之间没有其他指令可以执行?修改信号量值的过程在什么时候完成?这是它最终递减 S-- 的时候吗?

Does this mean that no other instructions can execute in-between while(S<=0) and S--?

没有。这意味着所有修改(例如 S--)必须以原子方式完成,也就是说,没有其他进程可以同时尝试修改 S,例如,通过执行 S++ in [=13] =].

At what point is the process done modifying the semaphore value? is this when it finally decrements S--?

如解释所述,每个修改都必须是原子的。这样就完成了每次修改结束时对值的修改。它可能会再次修改它,但那将是一个独特的修改,也必须是原子的。

您可以将“原子修改”视为不与任何其他原子访问或修改重叠的修改。如果 S++S-- 不是原子的,则操作可能会丢失,例如,如果两个进程执行 S++ 并且它们的操作重叠。他们可以同时读取 S,都递增 S,然后都写入 S,导致 S 只递增一次。

任何操作的原子性意味着:它要么发生,要么不发生。如果某个线程 A 对某个数据集合或某个对象执行原子操作,并且线程 B 检查 object/data,则线程 B 必须看到操作开始之前的 object/data,或者,就像手术结束后一样。 “原子”意味着线程 B 不可能看到 object/data 处于中途完成状态。

我们可以通过在访问数据时使用synchronized块或ReentrantLock对象来提供原子性,但是如果有人告诉你某些对象是原子的,那么他们所说的是,您可以对其执行的所有操作*都是自动保证是原子的,而无需显式锁定任何内容。


* 除了可能在对象的文档中提到的特殊情况。