C# 临界段与线程中止()

C# 临界段与线程中止(),c#,C#,下面是我经常用来执行锁定的模式: private IDisposable GetLock() { _lock.Wait(); return new Disposable(()=> _lock.Release()); } 我在这段代码中看到的唯一问题是Thread.Abort(),它可以进入_lock.Wait()和return语句之间,使锁处于不一致状态。我试图通过将其保存到变量中来避免这种情况: private IDisposable GetLock() { v

下面是我经常用来执行锁定的模式:

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();
    }
}
private IDisposable GetLock()
{
var l=_lock;
l、 等待();
尝试
{
var result=新的一次性(()=>_lock.Release());

l=null;//您永远不应该使用
线程.Abort()
。这通常意味着错误的代码结构。唯一的例外是,如果您必须使用有缺陷的第三方库(您无法更改该库的代码),您可以终止挂起的代码

放开
线程。中止()
,你的生活就会轻松得多

只需使用语句即可



终止线程会导致任意行为,这是一条常见的规则,应该始终避免。

您刚刚重新创建/编码了锁块。文件类实现IDisposable。您可以通过调用dispose来释放它。同样的重新创建,只是使用而不是锁。数据库负责管理它所创建的任何连接打开。最晚在超时时,它会这样做。您的要求一点也没有明确传达。我确信我的回答是正确的。您的asume认为有人(出于不合理的原因)编写代码的唯一目的是破坏您的代码。它会通过在空检查和dispose调用之间插入异常来进行破坏吗?那么,在发布过程中会发生什么,没有明显的原因?|因为这种破坏程度不在你的掌握之中。你还可以尝试保护你的代码不受断电或错误RAM的影响。因此,你的想法是,ThreadAbort可能会在finally block期间引发,并且没有针对这种wierd场景的保护措施?我知道,这是一个错误ad,但如果您编写API,没有人保护您免受此影响。有人使用您的代码,您只想编写lock primitve。如果primitve不好,系统如何开发会导致哪些死锁-没有人会使用它。当然,但您不应该修复不存在的问题。您不对开发人员的无知或缺乏经验负责hat使用您的API。中止线程会导致任意行为,这是一条常见规则,应始终避免。如果需要中止操作,则应在中构建一个。例如,设置一个您将检查的或是的,但有一个问题,为什么在互斥锁中不发生死锁。Enter()这当然是以某种方式编写的原语,以避免在中止时出现这种情况。关于可能的Thread.abort()。只需一个google: