我看不出错误,也许有人可以帮助我。
我有一个使用自旋锁的自定义锁(它适用于学校)
public class Spinlock : Locker
{
Boolean locked = false;
private SpinLock spinLock = new SpinLock();
public override void LockIt()
{
try
{
spinLock.Enter(ref locked);
}
finally
{
if(locked)
spinLock.Exit();
}
}
public override void UnlockIt()
{
}
}
public abstract class Locker
{
abstract public void LockIt();
abstract public void UnlockIt();
}
我得到的例外情况如下:
System.ArgumentException未处理
Message =在调用此方法之前,takeLock参数必须设置为false。
答案 0 :(得分:3)
是的,这不是正确的代码。当第二个线程也进入锁定并且它已被保持时,它将失败。 锁定变量必须是一个局部变量,以确保它具有线程关联。修正:
public override void LockIt()
{
bool locked = false;
try
{
spinLock.Enter(ref locked);
}
finally
{
if(locked)
spinLock.Exit();
}
}
请注意代码没有任何意义,输入锁定然后立即再次退出是没有意义的。我认为那是你真正的家庭作业。
答案 1 :(得分:0)
代码对我来说很好。 在进入锁定为false的锁定(spinLock.Enter)之前,您必须确保。 否则你会得到这个例外!
似乎代码的其他部分会覆盖该变量。