在我的大学幻灯片中,老师写道,这个MUTEX问题的解决方案不起作用。为什么呢?
lock = true表示关键部分已有进程
答案 0 :(得分:0)
假设你的'lock'变量只是一个变量,那么检查变量值然后有条件地设置该变量的代码可以是多个指令。
考虑以下psuedocode实现:
例如,请在C#中考虑此代码:
public static class Program
{
private static int locked = 0;
private static bool GetLock()
{
if( locked == 0 )
{
locked = 1;
return true;
}
else
{
return false;
}
}
}
考虑它的反汇编:
if( locked == 0 )
00000000 cmp dword ptr [0003E4F0h],0
00000007 jne 0000000000000019
{
locked = 1;
00000009 mov dword ptr [0003E4F0h],1
return true;
00000013 mov eax,1
00000018 ret
}
else
{
return false;
00000019 xor eax,eax
0000001b ret
现在考虑当两个线程同时尝试执行此操作时会发生什么:
现在无论线程1和线程2正在做什么工作(可能更新内存中的帐户余额)都会相互覆盖。如果这两个线程试图发布两个事务 - 添加1000,并删除500 - 这就是现在他们没有独占访问权会发生的事情:
现在由于线程错误,我的帐户余额缺少1000美元。