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)
这种模式根本没有锁定.每个线程都会创建一个新的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)
编辑:感谢评论者!情况存在,锁(这)可能是危险的.所以我删除了.
看起来你给每个线程都有自己的Mutex.那不行.
在大多数情况下,Mutex都是矫枉过正的.你只需要:
private static object syncLock = new object(); // just 1 instance
....
lock(syncLock)
{
// critical section
}
Run Code Online (Sandbox Code Playgroud)