2013-05-28 47 views
1

我試圖尋找一個競爭條件,我遇到了很多suspecious功能。它們中的大多數不允許同時從兩個線程中調用,但很難確保它們不會。有沒有辦法在C#中將代碼標記爲非線程安全?

是否有一些關鍵字指示運行時在函數並行執行時立即拋出異常?我知道我有時在另一個線程修改了一個即將枚舉的集合但有足夠依賴的保護措施時會得到異常?

運行時可以使用lock指令暫停執行,所以我需要的是一個lock,它會引發錯誤。

+0

爲什麼不只是使用正確的線程同步?確保只有一個線程進入不是多線程安全的部分。 – m0skit0

+0

類似列表的集合不是線程安全的,並且由於線程安全原因不引發該異常。當枚舉集合不支持被修改時引發異常。 – dtb

回答

5

您可以使用Monitor.TryEnter此:

bool entered = !Monitor.TryEnter(someLockObject); 
try 
{ 
    if (!entered) 
     throw Exception("Multi-thread call!"); 

    // Actual code 
} 
finally 
{ 
    if (entered) 
    { 
     Monitor.Exit(someLockObject); 
    } 
} 

而且這將是很好的換行代碼在自己的類:

public sealed class MultiThreadProtector : IDisposable 
{ 
    private object syncRoot; 

    public MultiThreadProtector(object syncRoot) 
    { 
     this.syncRoot = syncRoot; 

     if (!Monitor.TryEnter(syncRoot)) 
     { 
      throw new Exception("Failure!"); 
     } 
    } 

    public void Dispose() 
    { 
     Monitor.Exit(this.syncRoot); 
    } 
} 

這種方式,您可以按以下執行:

using (new MultiThreadProtector(someLockObject)) 
{ 
    // protected code. 
} 
相關問題