2

我试图寻找一个竞争条件,我遇到了很多可疑的功能。它们中的大多数不允许同时从两个线程调用,但很难确保它们不会。

是否有一些关键字可以指示运行时在函数并行执行时立即抛出异常?我知道当另一个线程修改我正在枚举的集合时,我有时会遇到异常,但是这样的保护措施是否足以依赖?

运行时可以使用该指令停止执行lock,所以我只需要一个lock引发错误的指令。

4

1 回答 1

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.
}
于 2013-05-28T20:07:29.440 回答