【发布时间】:2019-11-09 10:05:28
【问题描述】:
这是我经常用来执行锁定的模式:
private IDisposable GetLock()
{
_lock.Wait();
return new Disposable(()=> _lock.Release());
}
我在这段代码中看到的唯一问题是 Thread.Abort(),它可以进入 _lock.Wait() 和 return 语句之间,使锁处于不一致状态。我试图通过将其保存到变量中来避免这种情况:
private IDisposable GetLock()
{
var l = _lock;
l.Wait();
try
{
var result = new Disposable(()=> _lock.Release());
l = null; //<- I need to make this atomic, unabortable section
return result; //<- I need to make this atomic, unabortable section
}
finally
{
l?.Release();
}
}
但中止有时仍会使此部分陷入僵局。 怎样才能保护这部分免受 Thread.Abort() 的影响?
【问题讨论】:
-
你刚刚重新发明/编码了锁块。
-
文件类实现 IDisposeable。你通过调用 dispose 来释放它。同样的改造,只是使用而不是锁定。
-
数据库负责管理它打开的任何连接。最新的超时,它会这样做。您的要求至少没有明确传达。
-
所以我确定我是对的。您假设某人 - 没有合理的理由 - 会仅为破坏您的代码而编写代码。它会通过在 Null Check 和 dispose 调用之间插入异常来进行破坏吗?而这一切会在发布期间发生,没有明显的原因? |因为那个级别的破坏,不在你的手中。您不妨尝试保护您的代码免受断电或 RAM 故障的影响。
-
所以你的想法是 ThreadAbort 可以在 finally 块期间引发并且没有针对这种奇怪情况的保护?
标签: c#