繁体   English   中英

c#中互斥锁的使用

[英]Usage of Mutex in c#

我在c#中的线程处理方面有点新,一般来说,在我的程序中,我使用mutex只允许 1 个线程进入关键部分,并且由于未知原因进行一些 cw 打印,我可以看到有 1 个以上的线程进入我的关键部分,这是我的代码:

Mutex m = new Mutex();
m.WaitOne();
<C.S> // critical section here
m.ReleaseMutex();

我很想知道我是否在这里做错了,在此先感谢您的帮助。

编辑:

我的代码包括类,所以它基本上看起来更像这样:

public class test
{
    private mutex m;
    public test()
    {
         m = new mutex();
    }
    public func()
    {
         m.WaitOne();
         <C.S> // critical section here
         m.ReleaseMutex();
     }


    } 

这里的问题是所有调用者都使用不同的互斥锁; 您需要共享锁定对象,通常是将其设为字段。 例如,切换到更简单的lock比喻:

private readonly object syncLock = new object();
public void ThreadSafeMethod() {
    lock(syncLock) {
        /* critical code */
    }
}

或使用互斥锁:

private readonly Mutex m = new Mutex();
public void ThreadSafeMethod() {
    m.WaitOne();
    try {
        /* critical code */
    } finally {
        m.ReleaseMutex();
    }
}

这种模式根本没有锁定。 每个线程都会创建一个新的 Mutex 对象并立即拥有它的锁。 其他线程创建并使用新的互斥体本身。

考虑使用普通的 lock()!

lock(_lockobject) {
   // do inside what needs to be done - executed on a single thread only
} 

其中 _lockobject 是类中的一个简单私有变量:

private object _lockobject; 

编辑:感谢评论者! 存在锁(this)可能很危险的情况。 所以我删除了它。

看起来您为每个线程提供了自己的互斥锁。 那行不通。

在大多数情况下,互斥锁是矫枉过正的。 你只需要:

private static object syncLock = new object();  // just 1 instance

....

lock(syncLock)
{
    // critical section
}

Mutex 用于标识运行的应用程序实例。

 using (Mutex mutex = new Mutex(true, "app name", out createdNew))
            {
                if (createdNew)//check app is already run
                {
                    KillOthers();
                    StartApp();
                }
                else
                {
                    MessageBox.Show("Another instance already running!");
                }
            }

我可以对已接受的答案添加更正吗?

private readonly Mutex m = new Mutex();
public void ThreadSafeMethod() {
    while(!m.WaitOne()){}
    try {
        /* critical code */
    } finally {
        m.ReleaseMutex();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM