Как между процессами синхронизироваться?
От: Silver_s Ниоткуда  
Дата: 30.05.04 09:04
Оценка:
Непонятно зачем порезали Event'ы
Именованый межпроцессный Event создать нельзя. Остался только Mutex именованый но этого не достаточно.
А если потребуется например такая фича, один процесс запускает другой процесс и ждет пока он не просигнализирует об окончании загрузки.
Есть два варианта либо в цикле со Sleep'ами опрашивать пока загружаемый процесс Mutex не захватит. Либо по человечески сделать — через WinAPI ManualResetEvent сделать. Только вот затрудняюсь предположить не будет ли конфликтов каких то с .Net Threading, если WinAPI синхронизацию использовать. Не шаманство ли это?
Re: Как между процессами синхронизироваться?
От: mayevski  
Дата: 30.05.04 09:21
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_>Непонятно зачем порезали Event'ы

S_> Именованый межпроцессный Event создать нельзя. Остался только Mutex именованый но этого не достаточно.
S_> А если потребуется например такая фича, один процесс запускает другой процесс и ждет пока он не просигнализирует об окончании загрузки.
S_> Есть два варианта либо в цикле со Sleep'ами опрашивать пока загружаемый процесс Mutex не захватит. Либо по человечески сделать — через WinAPI
S_> ManualResetEvent сделать. Только вот затрудняюсь предположить не будет ли конфликтов каких то с .Net Threading, если WinAPI синхронизацию
S_> использовать. Не шаманство ли это?

С именоваными event'ами проблема на платформах, отличных от Win32. Да и начальная специфика проектов .Net (веб-сервисы, ASP.NET) не предполагала широкой межпроцессной синхронизации. Мы сделали свой человеческий Event, наследника от WaitHandle, через DLLImport. Там, правда, возникнут сложности с переносом на MONO и прочее, но это — как доберемся, решим. Named event'ы на базе посиксных и sys5 семафоров уже есть, так что перетянем в C# ...

С уважением,
Евгений Маевский
Re[2]: Как между процессами синхронизироваться?
От: Silver_s Ниоткуда  
Дата: 30.05.04 11:29
Оценка:
Здравствуйте, mayevski, Вы писали:

M>С именоваными event'ами проблема на платформах, отличных от Win32. Да и начальная специфика проектов .Net (веб-сервисы, ASP.NET) не предполагала широкой межпроцессной синхронизации...


Наверное из-за этого они отказались от именованых ивентов.
Шаманить с WinAPI тоже не хочется, т.к. задача того не оправдывает.

А задачка то в общем то примитивная. В небольшой dll'ке с интерфейсами Remoating объекта, сделать запуск известного процесса который эти Remoating объекты регистрирует и дождаться пока эти WellKnown типы появятся. Сам Remoating не знает какие у него WellKnown типы есть. По крайней мере я не неашел таких фичей.
А проверять наличие типов на локальной машине, создавая объекты и ловя exeption после таймаутов от неудачных обращений к их функциям не хорошо.

Остается такой вариант. Клиенту в цикле со Sleep'ами 10 милисекунд. Пытаться захватить именованый Mutex, если получается, то сразу освобождаем и дальше крутим цикл пока он не будет занят.
А на серваке после регистрации WellKnown типов, занимаем этот Mutex.
Ну и еще второй Mutex на серваке перед входом в код регистрации типов и каналов,чтобы защитить от входа из второй копии. Иначе рушится оба сервера.

Неужели это лучший вариант?
Re[3]: Как между процессами синхронизироваться?
От: mayevski  
Дата: 30.05.04 12:52
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_> Остается такой вариант. Клиенту в цикле со Sleep'ами 10 милисекунд. Пытаться захватить именованый Mutex, если получается, то сразу освобождаем и дальше крутим цикл пока он не будет занят.


Угу. Только вот (опять таки), WaitOne в .NET CF не имеет параметра ожидания и там тоже приходится делать через p/invoke.

С уважением,
Евгений Маевский
Re[3]: Как между процессами синхронизироваться?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.05.04 17:37
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_> Наверное из-за этого они отказались от именованых ивентов.

S_>Шаманить с WinAPI тоже не хочется, т.к. задача того не оправдывает.

Да там шаманства то особого нет, почти все есть. Если нужно могу завтра тебе исходники готового кинуть.

S_> Остается такой вариант. Клиенту в цикле со Sleep'ами 10 милисекунд. Пытаться захватить именованый Mutex, если получается, то сразу освобождаем и дальше крутим цикл пока он не будет занят.

S_> А на серваке после регистрации WellKnown типов, занимаем этот Mutex.
S_> Ну и еще второй Mutex на серваке перед входом в код регистрации типов и каналов,чтобы защитить от входа из второй копии. Иначе рушится оба сервера.

Можно проще — на сервере просто мьютекс создавать по завершению инициализации, а на клиенте пытаться открыть.
... << RSDN@Home 1.1.3 beta 2 (Win32NT 5.1.2600.0) >>
AVK Blog
Re[4]: Как между процессами синхронизироваться?
От: Silver_s Ниоткуда  
Дата: 30.05.04 20:44
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Можно проще — на сервере просто мьютекс создавать по завершению инициализации, а на клиенте пытаться открыть.


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

Mutex'ы ведь не дают ждать занятия, а только освобождения. Если 2 приемника ждут когда источник сигнала займет Mutex, то они должны пытаться его занять, если получилось значит быстренько его освобождаем и дальше цикл ожидания крутим. Но даже если быстро обратно освобождать, другой процесс тоже ждущий когда Mutex станет занятым может ошибочно ложный сигнал получить.
А как можно проверить состояние Mutexа и чтобы он при этом не включился (не захватился) — вроде никак.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.