2013-05-28 42 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. 
} 
相关问题