Multithreading 为了保证互斥,信号量操作需要是原子的

Multithreading 为了保证互斥,信号量操作需要是原子的,multithreading,operating-system,mutex,semaphore,Multithreading,Operating System,Mutex,Semaphore,如果等待和信号按如下方式执行: void Wait (Semaphore S) { while (S.count <=0){} S.count = S.count -1; } void Signal (Semaphore S){ S.count = S.count+1; } void等待(信号量S){ (S.count假设T1正在运行 它在信号量上输入wait,检查count是否小于或等于零,我们假设为false——循环结束 现在,调度程序停止线程并将控制权传递给T2。当然,它也会做同

如果等待和信号按如下方式执行:

void Wait (Semaphore S) {
while (S.count <=0){}
S.count = S.count -1;
}

void Signal (Semaphore S){
S.count = S.count+1;
}
void等待(信号量S){

(S.count假设T1正在运行

它在信号量上输入wait,检查count是否小于或等于零,我们假设为false——循环结束

现在,调度程序停止线程并将控制权传递给T2。当然,它也会做同样的事情,然后减少计数器,并被调度程序停止,控制权将返回给T1

T1继续减小值(这次不检查,循环结束!)并退出等待

控制被传递到T2,T2也退出等待


现在,它们都进入了临界区。

您的意思是,如果调度程序将控制权传递给T2,它将增加计数器,T2将被调度程序停止,同时控制权将返回给T1。T1继续减少计数器,T2将增加计数器……因此两者都将进入临界区!?为什么它们会增加它们?它们都进入
等待
。诀窍是其中一个在减少计数器之前停止,从而允许另一个通过循环。现在它们可以以任何顺序减少计数器并执行临界段,
信号
中的顺序无关紧要,到那时损害已经造成。