我试图追捕一个竞争条件,我遇到了许多可疑的功能。其中大部分都不允许同时从两个线程调用,但很难确保它们不会被调用。
是否有一些关键字指示运行时在函数并行执行时抛出异常?我知道当另一个线程修改我枚举的集合时,我有时会得到一个异常,但这样的保护措施是否足够依赖?
运行时可以使用lock
指令暂停执行,所以我只需要lock
就会抛出错误。
答案 0 :(得分: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.
}