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

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

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

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

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


person Roman Starkov    schedule 10.03.2010    source источник


Ответы (3)


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

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

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

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

person John Knoeller    schedule 11.03.2010
comment
Спасибо, что подтвердили это. Замечу, что я написал пример того, как это сделать на C # (не на исходном WinAPI!) В своем ответе здесь: stackoverflow.com/questions/778817/ < / а> - person Roman Starkov; 11.03.2010

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

person Seb    schedule 10.03.2010
comment
MSDN упоминает, что дескрипторы, удерживаемые завершенными процессами, освобождаются и что мьютекс удаляется, когда на него не остается дескрипторов, поэтому я почти уверен, что это не так. - person Roman Starkov; 10.03.2010

№1 звучит так, как вам следует идти.

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

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

person Pentium10    schedule 10.03.2010
comment
Но создание - это атомарная операция: вы всегда получаете дескриптор (при условии, что проверки безопасности прошли успешно) и можете проверить, существовал ли уже мьютекс, с помощью GetLastError. Кроме того, как можно дважды выполнить код запуска моего приложения - я уверен, что для этого потребуется повторный запуск процесса. - person Roman Starkov; 10.03.2010
comment
Вообще-то я видел это на мобильных устройствах. Когда ОС переводит приложение в режим ожидания или выполняет сборку мусора. Если вы снова получаете фокус приложения, оно перезапускается, и пакет передается, чтобы вернуть предыдущее состояние. - person Pentium10; 10.03.2010
comment
О, я вижу. Да, WinMobile любит закрывать / перезапускать приложения по желанию, но я пишу для полноценной ОС. - person Roman Starkov; 10.03.2010