Привет всем Нужно сделать, чтоб программа могла запуститься только 8 раз [upd]: т.е. 8 раз одновременно работающих копий. Остальные должны ждать. я использовать мутексы: если открыты все (8) - то WaitForMultipleObject() Мне нужно знать, какой мутекс из 8ми сработал Как можно это сделать? PS: я знаю это плохой способ синхронизации . Подскажите, как можно лучше решить задачу? PPS: извините за ошибки я учу русский недавно :p спасибо
DEEP =) и правда!! я в коде проверял только на тайм-аут. Если не тайм-аут - сработал мутекс. я не внимательно читал msdn Код (Text): Return Values If the function succeeds, the return value indicates the event that caused the function to return. This value can be one of the following. Value Description WAIT_OBJECT_0 to (WAIT_OBJECT_0 + nCount –1) The return value minus WAIT_OBJECT_0 indicates the lpHandles array index of the object that satisfied the wait. If more than one object became signaled during the call, this is the array index of the signaled object with the smallest index value of all the signaled objects. WAIT_TIMEOUT The time-out interval elapsed and the condition specified by the fWaitAll parameter is not satisfied. спасибо!
Могу предложить решение "в лоб". Создаём 1 байт именованной шаренной памяти через CreateFileMapping() и именованный мутекс. Мутекс нужен для синхронизации кода, который будет сначала проверять значение того самого одного байта, если меньше 8 - увеличиваем и запускаемся, если больше либо равно - подчищаем за собой и завершаемся. Вот и всё. На самом деле, это была такая полушутка. Шутка, потому что решение это слишком громоздкое, а "полу" - потому что и такое решение всё таки имеет право на жизнь. А если серьёзно, посмотри в сторону семафоров, они как бы для этого и предназначены, ибо имеют встроенный счётчик.
Klayd нет я имел ввиду что-то с синхронизацией если сделать как говорите вы, то прийдется юзать Process32First/Next, сравнивать имена. Т.е. у меня сейчас на все 10 строк сишного кода А так будет значительно больше
Можно использовать один семафор. Код (Text): main() { hSem = CreateSemaphore(NULL, 8, 8, L"MyUniqueSempahoreName"); WaitForSingleObject(hSem); ... ... ... ReleaseSemaphore(hSem); return; } А чтобы узнать, какой из процессов освободил семафор придётся наверное делать их перечисление. x64, saem time)
_Tai_ Хм. Можно конечно, только раз вам необходимо точно знать, какой именно из процессов выдал эвент, то [имхо] найденное вами решение - одно из самых простых. Не буду утверждать, что самое, однако близко к тому. А если этого не нужно, то в самом деле, нужно курить семафоризацию.
DEEP прочитал про синхронизацию у вас на сайте про мутексы мне не совсем понятен принцип т.е. в каждом новом процессе мы вызываем CreateSemaphore? OpenSemaphore нам не нужен?
_Tai_ Ненене, если для каждого процесса создавать свой семафор, то синхронизации не получится, ибо если мы хотим создать второй с тем же именем, Винда матюгнётся и ничего не создаст. Нужно поступать так: 1) Пробуем открыть семафор (с заранее известным именем, конечно же). 2а) Возвращён нуль? Если да, значит, мы первые! Создаём семафор сами. 2б) Если не нуль, то увеличиваем открытый семафор на 1. 3) При закрытии уменьшаем его на 1. Если он равен 0, значит процессов больше не осталось. Освобождаем. [+]: Впрочем, вру. При попытке создания семафора с тем же именем Винда просто возвращает хендл уже открытого, игнорируя все парамы кроме имени
DEEP ясно значит так же как с мутексами snMutex1 = OpenMutex() if (!snMutex1) snMutex1 = CreateMutex()
Проблема если программа завершается незапланировано - освобождение семафора (увел. счетчика на ед) не происходит и все остальные копии программы остаются в подвисшем состоянии Что делать? Ведь даже SEH не дает уверенности, что все не повиснет
Вот чем и полезны мютексы! Система освобождает мютекс (и вроде как генерирует его эвент) автоматически при любом типе завершения процесса-родителя: хоть обычном, хоть аварийном. ИМХО, лучше не париться и оставить всё как и было =)