Это правильное использование мьютекса? - PullRequest
10 голосов
/ 06 сентября 2008

У меня есть ситуация, когда у меня может быть несколько запущенных одновременно программ, и важно, чтобы только одна конкретная функция не выполнялась более чем в одном из этих экземпляров одновременно.

Это правильный способ использовать мьютекс для предотвращения этого?

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}

Ответы [ 2 ]

19 голосов
/ 06 сентября 2008

Вы сказали, что несколько экземпляров одного приложения, так что мы говорим о двух программах program.exe, верно? Оператор блокировки не будет блокировать несколько программ, только внутри программы. Если вы хотите настоящий Mutex, посмотрите на объект System.Threading.Mutex .

Вот пример использования:

bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
    try
    {
        mtx.WaitOne();

        MessageBox.Show("Click OK to release the mutex.");
    }
    finally
    {
        mtx.ReleaseMutex();
    }
}

Переменная созданная новая позволит вам узнать, была ли она создана в первый раз. Это только говорит вам, если он был создан, хотя. Если вы хотите получить блокировку, вам нужно вызвать WaitOne, а затем вызвать ReleaseMutex, чтобы снять ее. Если вы просто хотите увидеть, создали ли вы Mutex, просто создайте его.

5 голосов
/ 06 сентября 2008

Искатель правильный.

Совет Джеффа Рихтера в Clr Via C # (p638-9) о блокировке заключается в создании частного объекта специально для блокировки.

private Object _lock = new Object();

// usage
lock( _lock )
{
    // thread-safe code here..
}

Это работает, потому что _lock не может быть заблокирован ничем вне текущего класса.

РЕДАКТИРОВАТЬ: это применимо к потокам, выполняющимся в рамках одного процесса. @ Дэвид Мохундро верен для межпроцессной блокировки.

...