Правильно ли это использование мьютекса?

StackOverflow https://stackoverflow.com/questions/46909

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Правильный ли это способ использования мьютекса, чтобы этого не произошло?

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}
Это было полезно?

Решение

Вы сказали о нескольких экземплярах одного приложения, поэтому мы говорим о запуске двух программ program.exe, верно?Оператор блокировки не блокирует несколько программ, а только внутри программы.Если вам нужен настоящий мьютекс, посмотрите 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();
    }
}

Переменная «createNew» сообщит вам, была ли она создана в первый раз или нет.Однако он сообщает вам только о том, был ли он создан.Если вы хотите получить блокировку, вам нужно вызвать WaitOne, а затем вызвать ReleaseMutex, чтобы снять ее.Если вы просто хотите проверить, создали ли вы мьютекс, достаточно просто его создать.

Другие советы

Искатель прав.

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

private Object _lock = new Object();

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top