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

Приложение:
MS VS 6. C++. WinApi. Win98 и Win2k

Обсуждение

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

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

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

тогда возможна ситуация, что один поток "получит" мутекс1 и будет ждать мутекс 2, в то время как второй поток "получит" мутекс2 и будет ждать мутекс1. вот тут будет deadlock.
Форма ответа