二值信号量如何保证互斥?

How does binary semaphore guarantee mutual exclusion?

我刚刚看到二进制信号量保证互斥并且信号量可以被抢占。

二进制信号量 wait/down 的代码(取自 https://www.javatpoint.com/os-binary-semaphore-or-mutex

Down (semaphore S)   
{  
    if (s.value == 1) // if a slot is available in the   
    //critical section then let the process enter in the queue.   
    {  
        S.value = 0; // initialize the value to 0 so that no other process can read it as 1.   
    }  
    else  
    {  
        put the process (PCB) in S.L; //if no slot is available   
        //then let the process wait in the blocked queue.   
        sleep();   
    }  
}  

那么如果进程 P1 是 运行 并且它检查 down 函数中的条件并准备将 s.value 的值更改为 0,但在此之前它被抢占并且其 PCB保存并启动新进程 P2 运行 它检查条件并将 s.value 更改为 0 及其临界区 starts.on 另一方面,如果 P2 进入等待状态 [= =19=] 所以两者都可能进入他们的关键 sections.So 如何保持互斥??

二进制信号量通过确保将信号量值更改为 0(以表明它在临界区中)的进程是唯一可以再次更改信号量值(为 1)的进程来提供互斥.所以在我的问题中,即使 P1 开始执行,它也不会被抢占。因此,如果他们使用共享资源,它确保 P1 将在启动 P2 之前完成。 只有计数信号量可以被抢占,它们不保证互斥。