Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / WinAPI

Выпуск № 384
от 27.01.2007, 11:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 398, Экспертов: 40
В номере:Вопросов: 1, Ответов: 1


Вопрос № 72053: Уважаемые эксперты, поясните пожалуйста как система (Windows 98, 2000) оперирует с НЕименованными мьютексами. В MSDN этот вопрос как-то скромно обойден вниманием, а у меня возникло подозрение, что если процессы основной программы и например динамичес...

Вопрос № 72.053
Уважаемые эксперты, поясните пожалуйста как система (Windows 98, 2000) оперирует с НЕименованными мьютексами. В MSDN этот вопрос как-то скромно обойден вниманием, а у меня возникло подозрение, что если процессы основной программы и например динамически подгружаемых DLL создают несколько неименованных мьютексов, то они имеют шанс пересечься. Или это не возможно.
Создаются несколько мьютексов
CreateMutex((SECURITY_ATTRIBUTES *)NULL, FALSE, NULL);
В разных модулях и пара таких аналогично создается в двух DLL. Назначение у всех мьютексов различные.
Их захват идет везде с параметром INFINITE.
И вот судя по логам возможно(!!! может все-таки ошибся) функции ожидания разных неименованных мьютексов блокируют друг друга. Возможно ли такое? И в целом - для чего все-таки имеет смысл использовать неименованые мьюнексы.
Если есть ссылки на подробный разбор полетов по этой теме - буду премного благодарен.

Приложение:

Отправлен: 22.01.2007, 11:07
Вопрос задал: Tek (статус: 8-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Bob Johnson
Здравствуйте, Tek!
Нет, неименованные мутексы не могут "пересечься". если ты создаешь новый неименованный мутекс, то всегда создается еще один мутекс (ОС не пытается открыть существующий). это удобно использовать, если handle на мутекс нужен только в пределах одного процесса (для синхронизации отдельных его потоков), в то время как таких процессов может быть несколько одновременно. так что в твоем случае проблема скорее всего где-то еще.
потенциально опасное место применения объектов синхронизации демонстрирует следующий код (допустим, нам необходимо "получить" два мутекса):

в одном месте:
WaitForSingleObject (mutex1, INFINITE);
WaitForSingleObject (mutex2, INFINITE);

в другом месте:
WaitForSingleObject (mutex2, INFINITE);
WaitForSingleObject (mutex1, INFINITE);

тогда возможна ситуация, что один поток "получит" мутекс1 и будет ждать мутекс 2, в то время как второй поток "получит" мутекс2 и будет ждать мутекс1. вот тут будет deadlock.
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 22.01.2007, 11:33
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Схема этого дедлока конечно известна, так же как и методы его решения.
Если не сложно, я в минифоруме задал еще уточняющие вопросы. Ответьте пожалуйста.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

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

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.43 beta от 26.01.2007
Яндекс Rambler's Top100

В избранное