Мьютекс на процесс - есть такое ?

qwe2015
Дата: 23.06.2015 08:43:33
Есть клиент и сервер - разные приложения, которые между собой взаимодействуют. Для идентификации того, что сервер "живой" использую мьютекс. Проблема в том, что сервер может создаться в одном потоке, а работа с ним может происходить в других потоках. Соответственно, если поток-создатель сервера завершается, то мьютекс снимается и клиенты думают, что сервер умер. Есть что-то подобное мьютексу, но чтобы существовало в рамках всего процесса и не снималось при завершении потока, в котором он был создан ?
qwe2015
Дата: 23.06.2015 09:01:58
Или, думаю, запустить в сервере отдельный поток, в котором и создать этот мьюткс и чтобы этот поток постоянно висел всё время, пока работает сервер.
m_Sla
Дата: 23.06.2015 09:04:29
Джеффри Рихтер. Windows для профессионалов. Создание эффективных Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows:
+

Теперь, когда Вы научились именовать объекты, рассмотрим, как разделять их между процессами по именам. Допустим, после запуска процесса А вызывается функция:

HANDLE hMutexPronessA = CreateMutex(NULL, FALSE, "JeffMutex");

Этот вызов заставляет систему создать новенький, как с иголочки, объект ядра "мъютекс" и присвоить ему имя JeffMutex Заметьте, что описатель hMutexProcessA в процессе А не является наследуемым, — он и не должен быть таковым при простом именовании объектов.

Спустя какое-то время некий процесс порождает процесс В. Необязательно, что-бы последний был дочерним от процесса А; он может быть порожден Explorer или любым другим приложением. (В этом, кстати, и состоит преимущество механизма именования объектов перед наследованием.) Когда процесс В приступает к работе,
исполняется код:

HANDLE hMutexProcessB = CreateMutex(NULL, FALSE, "JeffMutex");

При этом вызове система сначала проверяет, не существует ли уже объект ядра с таким именем. Если да, то ядро проверяет тип этого объекта. Поскольку мы пытаемся создать мьютекс и его имя тоже JeffMutex, система проверяет права доступа вызывающего процесса к этому объекту. Если у него есть все права, в таблице описателей, принадлежащей процессу В, создается новая запись, указывающая на существующий объект ядра. Если же вызывающий процесс не имеет полных прав на доступ к объекту или если типы двух объектов с одинаковыми именами не совпадают, вызов CreateMutex заканчивается неудачно и возвращается NULL.

Однако, хотя процесс В успешно вызвал CreateMutex, новый объект-мьютекс он не создал. Вместо этого он получил свой описатель существующего объекта-мьютекса. Счетчик объекта, конечно же, увеличился на 1, и теперь этот объект не разрушится, пока его описатели не закроют оба процесса — А и В. Заметьте, что значения описателей объекта в обоих процессах скорее всего разные, но так и должно быть, каждый процесс будет оперировать с данным объектом ядра, используя свой описатель.

MasterZiv
Дата: 23.06.2015 11:29:57
qwe2015,

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

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

да, ты не сказал - Win32?
mayton
Дата: 23.06.2015 12:13:51
qwe2015, почитай на тему что такое "процесс" и "поток" в Windows. Может часть вопросов сами отпадут.
Dima T
Дата: 23.06.2015 12:25:05
qwe2015, ты бы простой пример кода привел как у тебя мьютекс используется.

Есть подозрение что ты в каком-то потоке блокируешь мьютекс, запускаешь еще один поток (сервер), а затем исходный поток завершается и мьютекс автоматом разблокируется. Если так - блокируй его в потоке сервера или замени мьютекс на event.
bdm77
Дата: 24.06.2015 10:58:52
qwe2015
Или, думаю, запустить в сервере отдельный поток, в котором и создать этот мьюткс и чтобы этот поток постоянно висел всё время, пока работает сервер.


Так и работают сервера. Бежит процесс и слушает соккет, получает из соккета (от клиента) сообщение,
обработал и дальше слушает соккет.