ReleaseMutex и WaitForSingleObject

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

  1. droopy

    droopy New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2004
    Сообщения:
    21
    Привет. Помогите кто знает.

    Есть 2 процесса - дочерний и родительский. Дочерний унаследовал от родителя мутекс, который он и ждет. Если он не дождался в течении какого-то времени, то он должен умереть.
    То есть такой код:
    Код (Text):
    1. ...
    2.      dwResult = WaitForSingleObject(hMutex, TimeOut);
    3.      if(dwResult == WAIT_TIMEOUT)
    4.      {
    5.             ExitProcess(0);
    6.      }
    7.      if(dwResult == WAIT_OBJECT_0)
    8.      {
    9.            //общаемся с предком
    10. ....
    Теперь, предку нужно узнать, ждет ли потомок мутекс... и живой ли он вообще. Ничего лучше не придумал, как освободить мутекс, и потом заново его проверить. И вот тут меня мучает вопрос: как быстро ждущий процесс захватит освободившийся мутекс? Вот код предка
    Код (Text):
    1. ...
    2.      hMutex = CreateMutex(&sa, true, NULL);     //наследуемый, заблокированный
    3.      CreateProcess(...
    4. ...
    5.  
    6. //через некоторое время мы захотели пообщаться
    7.      ReleaseMutex(hMutex);
    8.  
    9. //может сюда вставить Sleep(0)?
    10.  
    11.      if(WaitForSingleObject(hMutex, 0) == WAIT_TIMEOUT)
    12.      {
    13.            //Дочерний процесс захватил мутекс
    14.      }
    15.      else
    16.      {
    17.            //Пообщаться не удастся
    18.      }
    Подскажите, нужно ли вставлять Sleep(0) после ReleaseMutex, или вообще такое решение неправильно?
     
  2. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Если я не ошибаюсь:
    Код (Text):
    1. dwResult = WaitForSingleObject(hMutex, TimeOut);
    2.      if(dwResult == WAIT_TIMEOUT)
    3.      {
    4.             ExitProcess(0);
    5.      }
    6.      if(dwResult == WAIT_OBJECT_0)
    7.      {
    8.            ReleaseMutex(hMutex);
    9.            //общаемся с предком
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    if WaitForSingleObject(HandleOfChildProcess, 0) == WAIT_TIMEOUT
    {
    // Дочерний процесс живой
    }
     
  4. droopy

    droopy New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2004
    Сообщения:
    21
    Partner
    Дочерний процесс может быть живой, но может быть в практическом смысле бесполезный. Допустим:
    Код (Text):
    1. //Дочерний процесс
    2.      dwResult = WaitForSingleObject(hMutex, TimeOut);
    3. //Произошел таймаут.. dwResult = WAIT_TIMEOUT
    4. //<-- В этом месте происходит переключение потоков на родительский -->
    5.      if(dwResult == WAIT_TIMEOUT)
    6.      {
    7.             ExitProcess(0);
    8. ...
    9. // Родительский процесс
    10.     if(WaitForSingleObject(HandleOfProcess, 0) == WAIT_TIMEOUT)
    11. // Процесс живой... но никакая информация от нас его уже не интересует :-(
    Я хотел узнать ответ вот на какой вопрос:
    Будет ли объект (в данном случае мутекс) захвачен ожидающим его потоком сразу при выходе из ReleaseMutex?
    Или мне нужно ждать следующего тика (вызовом Sleep(0))?Что-то в документации об этом слабо упоминается..
    Полистал Соломона и Руссиновича... Там говорится что вроде бы сразу. Причем ждущий поток может забрать у текущего окончание его тика, если у него приоритет выше. Но как-то это расплывчато...
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Будет захвачен сразу. Но поток, захвативший мютекс, получит управление когда придет его время. Если ты вызовешь Sleep(0) - возможно ты ускоришь этот момент.