2013-09-22 114 views
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了未處理

消息=該tookLock參數在調用此方法之前必須設置爲false。

+0

請提供我們的儲物櫃等級clode。成員中沒有位於代碼中的錯誤。 –

+0

@OndrejJanacek我已經添加了Locker類的代碼 –

回答

3

是的,這是不正確的代碼。當第二個線程也進入該鎖並且它已被保持時它將失敗。 鎖定變量必須是一個局部變量,以確保它具有線程關聯性。修復:

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

請注意,代碼否則沒有意義,沒有意義進入一個鎖,然後立即退出它。我認爲這是你真正的家庭作業。

+0

謝謝,這確實有效 –

0

該代碼適合我。 在輸入鎖定(spinLock.Enter)之前,您必須確保鎖定爲false。 否則你會得到這個異常!

似乎您的代碼的其他部分覆蓋該變量。