我试图寻找一个竞争条件,我遇到了很多可疑的功能。它们中的大多数不允许同时从两个线程调用,但很难确保它们不会。
是否有一些关键字可以指示运行时在函数并行执行时立即抛出异常?我知道当另一个线程修改我正在枚举的集合时,我有时会遇到异常,但是这样的保护措施是否足以依赖?
运行时可以使用该指令停止执行lock
,所以我只需要一个lock
引发错误的指令。
我试图寻找一个竞争条件,我遇到了很多可疑的功能。它们中的大多数不允许同时从两个线程调用,但很难确保它们不会。
是否有一些关键字可以指示运行时在函数并行执行时立即抛出异常?我知道当另一个线程修改我正在枚举的集合时,我有时会遇到异常,但是这样的保护措施是否足以依赖?
运行时可以使用该指令停止执行lock
,所以我只需要一个lock
引发错误的指令。
您可以为此使用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.
}