簡體   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