带旋转锁的自定义锁
本文关键字:自定义 旋转 | 更新日期: 2023-09-27 18:32:15
我看不到错误,也许有人可以在这里帮助我。
我有一个使用旋转锁的自定义锁(这是学校的锁)
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 未处理
消息=在调用此方法之前,必须将 tookLock 参数设置为 false。
是的,这不是正确的代码。 当第二个线程也进入锁并且它已被持有时,它将失败。 锁定的变量必须是局部变量,以确保它具有线程相关性。 修复:
public override void LockIt()
{
bool locked = false;
try
{
spinLock.Enter(ref locked);
}
finally
{
if(locked)
spinLock.Exit();
}
}
请注意,代码在其他方面毫无意义,进入锁然后立即再次退出是没有意义的。 我想这是你真正的家庭作业。
代码对我来说很好用。在进入锁(spinLock.Enter)之前,您必须确保锁定为假。否则,你会得到这个例外!
似乎代码的其他部分覆盖了该变量。