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