首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET SpinLock不释放Thread.BeginCriticalSection

.NET SpinLock不释放Thread.BeginCriticalSection
EN

Stack Overflow用户
提问于 2011-04-05 03:15:45
回答 1查看 247关注 0票数 1

使用Thread.BeginCriticalRegion反射器,我发现SpinLock结构有很多调用.NET而不调用Thread.EndCriticalRegion.的情况例如,在公共函数SpinLock.Enter(ref bool lockTaken) (.NET 4.0)中:

代码语言:javascript
复制
// ...
Thread.BeginCriticalRegion();
if (Interlocked.CompareExchange(ref this.m_owner, managedThreadId, owner, ref lockTaken) == owner)
    return;  // <--- !!
Thread.EndCriticalRegion();
// ...

在另一种情况下,Thread.EndCriticalRegion似乎没有调用Thread.BeginCriticalRegion.就调用了SpinLock.Exit

代码语言:javascript
复制
public void Exit(bool useMemoryBarrier)
{
    if (this.IsThreadOwnerTrackingEnabled && !this.IsHeldByCurrentThread)
        throw ...

    if (useMemoryBarrier)
    {
        if (this.IsThreadOwnerTrackingEnabled)
            Interlocked.Exchange(ref this.m_owner, 0);
        else
            Interlocked.Decrement(ref this.m_owner);
    }
    else if (this.IsThreadOwnerTrackingEnabled)
        this.m_owner = 0;
    else
    {
        int owner = this.m_owner;
        this.m_owner = owner - 1;
    }
    Thread.EndCriticalRegion();   // <--- ??
}

因此,问题是:是否有任何问题是由于不平衡开始/终止关键区域的调用而产生的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-05 03:28:48

请注意,如果实际获取了锁,然后通过调用Exit()释放锁,则Begin/End调用将保持平衡。标记关键区域的调用是必要的,以便让CLR知道,当获得SpinLock时,线程中断可能会造成损害。有关更多信息,请参见这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5546797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档