WaitForMultipleObject для 8 мутексы

Тема в разделе "WASM.WIN32", создана пользователем _Tai_, 29 авг 2008.

  1. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    Привет всем
    Нужно сделать, чтоб программа могла запуститься только 8 раз

    [upd]:
    т.е. 8 раз одновременно работающих копий. Остальные должны ждать.

    я использовать мутексы: если открыты все (8) - то WaitForMultipleObject()

    Мне нужно знать, какой мутекс из 8ми сработал
    Как можно это сделать?

    PS: я знаю это плохой способ синхронизации . Подскажите, как можно лучше решить задачу?
    PPS: извините за ошибки я учу русский недавно :p

    спасибо
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Так ведь Wait возвращает хендл сработавшего мютекса! Тот чей хендл возвращён, и есть тот что нужен.
     
  3. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    DEEP
    =)

    и правда!!

    я в коде проверял только на тайм-аут. Если не тайм-аут - сработал мутекс.

    я не внимательно читал msdn

    Код (Text):
    1. Return Values
    2. If the function succeeds, the return value indicates the event that caused the function to return. This value can be one of the following.
    3.  
    4. Value Description
    5. 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.
    6.  
    7.  
    8. WAIT_TIMEOUT The time-out interval elapsed and the condition specified by the fWaitAll parameter is not satisfied.
    спасибо!
     
  4. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    DEEP
    а можно как-то по другому решить задачу?
    без мутексов ? что-то более простое например....
     
  5. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    мб перечислять процессы, и если там уже есть 8 твоих процессов то не запускать новый
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Могу предложить решение "в лоб". Создаём 1 байт именованной шаренной памяти через CreateFileMapping() и именованный мутекс. Мутекс нужен для синхронизации кода, который будет сначала проверять значение того самого одного байта, если меньше 8 - увеличиваем и запускаемся, если больше либо равно - подчищаем за собой и завершаемся. Вот и всё.

    На самом деле, это была такая полушутка. Шутка, потому что решение это слишком громоздкое, а "полу" - потому что и такое решение всё таки имеет право на жизнь. А если серьёзно, посмотри в сторону семафоров, они как бы для этого и предназначены, ибо имеют встроенный счётчик.
     
  7. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    Klayd
    нет
    я имел ввиду что-то с синхронизацией

    если сделать как говорите вы, то прийдется юзать Process32First/Next, сравнивать имена.
    Т.е. у меня сейчас на все 10 строк сишного кода

    А так будет значительно больше
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Можно использовать один семафор.
    Код (Text):
    1. main()
    2. {
    3.     hSem = CreateSemaphore(NULL, 8, 8, L"MyUniqueSempahoreName");
    4.     WaitForSingleObject(hSem);
    5.     ...
    6.     ...
    7.     ...
    8.     ReleaseSemaphore(hSem);
    9.     return;
    10. }
    А чтобы узнать, какой из процессов освободил семафор придётся наверное делать их перечисление.



    x64, saem time)
     
  9. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    _Tai_
    Хм. Можно конечно, только раз вам необходимо точно знать, какой именно из процессов выдал эвент, то [имхо] найденное вами решение - одно из самых простых. Не буду утверждать, что самое, однако близко к тому. А если этого не нужно, то в самом деле, нужно курить семафоризацию.
     
  10. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    DEEP
    знать нужно, поэтому оставлю мутексы.

    огромное спасибо !
     
  11. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    DEEP
    прочитал про синхронизацию у вас на сайте про мутексы
    мне не совсем понятен принцип

    т.е. в каждом новом процессе мы вызываем CreateSemaphore?

    OpenSemaphore нам не нужен?
     
  12. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    _Tai_
    Ненене, если для каждого процесса создавать свой семафор, то синхронизации не получится, ибо если мы хотим создать второй с тем же именем, Винда матюгнётся и ничего не создаст.

    Нужно поступать так:
    1) Пробуем открыть семафор (с заранее известным именем, конечно же).
    2а) Возвращён нуль? Если да, значит, мы первые! Создаём семафор сами.
    2б) Если не нуль, то увеличиваем открытый семафор на 1.
    3) При закрытии уменьшаем его на 1. Если он равен 0, значит процессов больше не осталось. Освобождаем.

    [+]: Впрочем, вру. При попытке создания семафора с тем же именем Винда просто возвращает хендл уже открытого, игнорируя все парамы кроме имени
     
  13. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    DEEP
    ясно
    значит так же как с мутексами

    snMutex1 = OpenMutex()
    if (!snMutex1) snMutex1 = CreateMutex()
     
  14. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    Проблема
    если программа завершается незапланировано - освобождение семафора (увел. счетчика на ед) не происходит и все остальные копии программы остаются в подвисшем состоянии

    Что делать?

    Ведь даже SEH не дает уверенности, что все не повиснет
     
  15. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Вот чем и полезны мютексы! Система освобождает мютекс (и вроде как генерирует его эвент) автоматически при любом типе завершения процесса-родителя: хоть обычном, хоть аварийном.

    ИМХО, лучше не париться и оставить всё как и было =)