2

我看不到错误,也许有人可以在这里帮助我。

我有一个使用自旋锁的自定义锁(这是学校用的)

 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。

4

2 回答 2

6

是的,这不是正确的代码。当第二个线程也进入锁并且它已经被持有时,它将失败。锁定变量必须是局部变量,以确保它具有线程亲和性。使固定:

public override void LockIt()
{
    bool locked = false;
    try
    {
        spinLock.Enter(ref locked);
    }
    finally
    {
        if(locked)
            spinLock.Exit();
    }
}

请注意,否则代码没有意义,进入锁然后立即再次退出是没有意义的。我认为这是你真正的家庭作业。

于 2013-09-22T13:44:37.207 回答
0

该代码对我来说很好。在你输入锁之前你必须确保锁(spinLock.Enter)是假的。否则你会得到这个异常!

似乎您的代码的其他部分会覆盖该变量。

于 2013-09-22T13:40:53.493 回答