[英]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.