在c#中使用互斥锁

Nad*_*ern 32 c# multithreading mutex

我在c#的线程中有点新,在一般情况下,在我的程序中我mutex只允许1个线程进入一个关键部分并且由于未知的原因做了一些cw打印我可以看到超过1个线程进入我的内部关键部分,这是我的代码:

Mutex m = new Mutex();
m.WaitOne();
<C.S> // critical section here
m.ReleaseMutex();
Run Code Online (Sandbox Code Playgroud)

我非常想知道我是否在这里犯了一个错误,在此先感谢您的帮助.

编辑:

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

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


    } 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 56

这里的问题是你的所有呼叫者都使用不同的互斥锁; 你需要共享锁定对象,通常是将它作为一个字段.例如,切换到一个更简单的lock比喻:

private readonly object syncLock = new object();
public void ThreadSafeMethod() {
    lock(syncLock) {
        /* critical code */
    }
}
Run Code Online (Sandbox Code Playgroud)

或使用互斥锁:

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

  • Nadav - 你确定你没有超过一个类的实例吗?几乎所有的“锁/互斥锁让多个调用通过”问题都证明锁/互斥锁对象的数量比您预期的要多。 (2认同)

use*_*238 5

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

考虑使用常规锁()!

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

其中_lockobject是您班级中的一个简单私有变量:

private object _lockobject; 
Run Code Online (Sandbox Code Playgroud)

编辑:感谢评论者!情况存在,锁(这)可能是危险的.所以我删除了.

  • 不要'锁定(this)`,或`lock(someType)`或`lock(anyString)` - 那些设计不好而且不健壮. (4认同)
  • 顺便说一句,锁定这不是总是好主意,更好的是创建类型对象的简单变量http://www.toolazy.me.uk/template.php?content=lock%28this%29_causes_deadlocks.xml (2认同)
  • 锁(这个)不被认为是好习惯.(参见http://haacked.com/archive/2006/08/08/ThreadingNeverLockThisRedux.aspx).使一个Object只是为了锁定更好,并且忘记了让任何对象被锁定的.NET设计错误. (2认同)

Hen*_*man 5

看起来你给每个线程都有自己的Mutex.那不行.

在大多数情况下,Mutex都是矫枉过正的.你只需要:

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

....

lock(syncLock)
{
    // critical section
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定从问题中我们可以推断出 `static` 是有意为...虽然我们也不能推断它 * 不是 * ;p (2认同)