当前位置:  开发笔记 > 编程语言 > 正文

C# - 锁定Mutex的问题

如何解决《C#-锁定Mutex的问题》经验,为你挑选了1个好方法。



1> Sam Saffron..:

如果需要跨进程同步,则应该只使用互斥锁.

虽然互斥锁可以用于进程内线程同步,但通常首选使用Monitor,因为监视器是专门为.NET Framework设计的,因此可以更好地利用资源.相反,Mutex类是Win32构造的包装器.虽然它比监视器更强大,但互斥锁需要互操作转换,这些转换的计算成本比Monitor类所需的更高.

如果需要支持进程间锁定,则需要Global mutex.

使用的模式非常脆弱,没有异常处理,并且您无法确保释放Mutex.这是非常危险的代码,并且很可能是您在没有超时时看到这些代码挂起的原因.

此外,如果您的文件操作时间超过1.5秒,那么并发互斥锁将无法抓取它.我建议正确锁定并避免超时.

我认为最好重新写这个来使用锁.此外,看起来你正在呼唤另一种方法,如果这需要永远,锁将永远保持.那是非常危险的.

这既短又安全:

// if you want timeout support use 
// try{var success=Monitor.TryEnter(m_syncObj, 2000);}
// finally{Monitor.Exit(m_syncObj)}
lock(m_syncObj)
{
    l.LogInformation( "Got lock to read/write file-based server state."
                    , (Int32)VipEvent.GotStateLock);
    using (var fileStream = File.Open( ServerState.PATH, FileMode.OpenOrCreate
                                     , FileAccess.ReadWrite, FileShare.None))
    {
        // the line below is risky, what will happen if the call to invoke
        // never returns? 
        result = func.Invoke(fileStream);
    }
}

l.LogInformation("Released state file lock.", (Int32)VipEvent.ReleasedStateLock);
return true;

// note exceptions may leak out of this method. either handle them here.
// or in the calling method. 
// For example the file access may fail of func.Invoke may fail

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有