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

这是正确使用互斥锁吗?

如何解决《这是正确使用互斥锁吗?》经验,为你挑选了2个好方法。

我有一种情况,我可能会同时运行一个程序的多个实例,并且重要的是只有一个特定的函数不能同时在多个这些实例中执行.

这是使用互斥锁来防止这种情况发生的正确方法吗?

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}

David Mohund.. 19

你说过一个应用程序的多个实例,所以我们说的是两个program.exe的运行,对吧?锁定语句不会在程序中锁定多个程序.如果您想要一个真正的Mutex,请查看System.Threading.Mutex对象.

这是一个用法示例:

bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
    try
    {
        mtx.WaitOne();

        MessageBox.Show("Click OK to release the mutex.");
    }
    finally
    {
        mtx.ReleaseMutex();
    }
}

createdNew变量将让您知道它是否是第一次创建.但它只会告诉您它是否已创建.如果要获取锁定,则需要调用WaitOne,然后调用ReleaseMutex将其释放.如果您只想查看是否创建了Mutex,只需构建它就可以了.



1> David Mohund..:

你说过一个应用程序的多个实例,所以我们说的是两个program.exe的运行,对吧?锁定语句不会在程序中锁定多个程序.如果您想要一个真正的Mutex,请查看System.Threading.Mutex对象.

这是一个用法示例:

bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
    try
    {
        mtx.WaitOne();

        MessageBox.Show("Click OK to release the mutex.");
    }
    finally
    {
        mtx.ReleaseMutex();
    }
}

createdNew变量将让您知道它是否是第一次创建.但它只会告诉您它是否已创建.如果要获取锁定,则需要调用WaitOne,然后调用ReleaseMutex将其释放.如果您只想查看是否创建了Mutex,只需构建它就可以了.



2> Jonathan Web..:

TheSeeker是对的.

Jeff Richter 关于锁定的Clr Via C#(p638-9)的建议是创建一个专门用于锁定目的的私有对象.

private Object _lock = new Object();

// usage
lock( _lock )
{
    // thread-safe code here..
}

这是有效的,因为_lock不能被当前类之外的任何东西锁定.

编辑:这适用于在单个进程中执行的线程.@David Mohundro的答案对于进程间锁定是正确的.

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