Является ли хорошей идеей использовать наличие именованного мьютекса в качестве индикатора? - PullRequest
4 голосов
/ 10 марта 2010

Я использую именованный мьютекс, чтобы обнаружить другие экземпляры моего приложения и соответствующим образом завершить работу, и обнаружил, что есть два способа сделать это:

  1. Создать мьютекс; игнорировать указание, существовало ли оно уже; попытаться приобрести его; используйте тот факт, что приобретение прошло успешно / не удалось.
  2. Создать мьютекс; используйте указание, существовало ли оно уже.

Я не могу решить, приобретать ли мьютекс (и освобождать при выходе). С одной стороны, получение + освобождение, даже если оно не имеет никакой известной разницы, похоже на культивирование груза, но с другой стороны, существование объекта-мьютекса звучит как побочный эффект от его фактической предполагаемой функциональности.

Итак, я должен сделать # 1 или # 2, чтобы определить, запущено ли уже приложение?

Ответы [ 3 ]

2 голосов
/ 11 марта 2010

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

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

Например, вы можете использовать мьютекс, пока не выйдете из кода инициализации. Таким образом, только один экземпляр вашей программы может быть инициализирован за один раз. Если вы берете мьютекс после его открытия, тот, который получил мьютекс, сначала знает, что в его коде инициализации нет другого экземпляра. Но что более важно, тот, кто не создал мьютекс, знает, что создаваемый объект имеет закончено инициализацию.

Таким образом, если экземпляр 2 хочет установить связь с экземпляром 1, он знает, что экземпляр 1 готов к прослушиванию, как только он сможет войти в мьютекс хотя бы один раз. Это будет работать лучше, если вы создадите мьютекс, как было изначально указано, чтобы быть абсолютно уверенным, что создатель станет первым владельцем.

0 голосов
/ 10 марта 2010

# 1 звучит так, как вы должны идти.

Создать мьютекс; игнорировать указание, существовало ли оно уже; попытаться приобрести его; использовать тот факт, что приобретение прошло успешно / не удалось

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

0 голосов
/ 10 марта 2010

Я не уверен в этом, но названный мьютекс может все еще существовать, если программа падает и не завершается должным образом Если это так, проверка на существование пройдет успешно, тогда как другие экземпляры не были запущены. Таким образом, я лично предпочел бы попытаться приобрести его; -)

...