Как отследить зависание потока в многопоточном приложении?

Тема в разделе "WASM.BEGINNERS", создана пользователем dyn, 30 янв 2011.

  1. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Есть ехе и в нем 3 потока.
    Первый поток отрабатывает нормально, второй поток из-за некоторых особенностей может зависать. Третий нужен для того, чтобы отслеживать, зависает второй или нет.
    Вопрос, как отследить зависание второго потока из третьего, если время, за которое должен отработать второй поток - неизвестно?
    Т.е. WaitForSingleObject тут не прокатывает.
     
  2. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Решение в лоб - пускай поток перед началом выполнения ставит какую-нить переменную в false, после выполнения - true. По таймеру через каждые 100 мс проверять значение переменной. Если false - завис поток. ))
     
  3. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Вообще херню сказал, не обращайте внимания.
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    dyn
    пусть меняет иногда значение какой либо переменной, и поток смотри через периоды изменилась или нет. Ну это так в лоб. Можно тупо делать ++.
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    dyn

    А в чем он зависает, и каков критерий зависания? Если виснет в WaitForSingleObject, то можно сделать свой враппер, который будет вайтать в цикле, и если событие не произошло через N времени, то считать поток зависшим (например - выставить флаг в thread specific data, или как там ее).
     
  7. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    _sheva740
    Твой код просто ждет завершения работающего потока. Мютекс не освободится не только в случае зависания.
    Здесь просто нужно выяснить причины зависания в конкретном случае,или считать его зависшим при превышении некоторого максимального значения ожидания.
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    AndjellaArtavazdovna
    Да набузил я там что-то по наитию )))
    Наверное так правильно
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #include <time.h>
    4. #define WAIT_4_Proc2 3000L
    5.  
    6.     DWORD WINAPI TProc1(LPVOID data);
    7.     DWORD WINAPI TProc2(LPVOID data);
    8.  
    9.  
    10.  
    11. //-------------------------------------------------------------------
    12. int main()
    13. {
    14.     DWORD dwtid;
    15.     HANDLE pProcess1;
    16.     DWORD dwWaitResult;
    17.     pProcess1 = CreateThread(NULL,0,TProc1,NULL,0,&dwtid);
    18.  
    19.     // Ждем окончания первого прцесса
    20.     dwWaitResult = WaitForSingleObject(pProcess1, -1);
    21.     switch (dwWaitResult) {
    22.         case WAIT_OBJECT_0:
    23.             printf("- from [0]\t-\tWAIT_OBJECT_0\n");
    24.             break;
    25.         case WAIT_TIMEOUT:
    26.             printf("- from [0]\t-\tWAIT_TIMEOUT\n");
    27.             break;
    28.         default:
    29.             printf("- from [0]\t-\t????\n");
    30.             return 1;
    31.     }
    32.     return 0;
    33. }
    34. //---------------------------------------------------------------------
    35. DWORD WINAPI TProc1(LPVOID data)
    36. {
    37.     DWORD dwtid;
    38.     HANDLE pProcess2;
    39.     DWORD dwWaitResult;
    40.    
    41.     pProcess2 = CreateThread(NULL,0,TProc2,NULL,0,&dwtid);
    42.     // Ждем окончания второго прцесса
    43.     dwWaitResult = WaitForSingleObject(pProcess2, WAIN_4_Proc2);
    44.  
    45.     switch (dwWaitResult) {
    46.         case WAIT_OBJECT_0:
    47.             printf("- from [1]\t-\tWAIT_OBJECT_0\n");
    48.             break;
    49.         case WAIT_TIMEOUT:
    50.             printf("- from [1]\t-\tWAIT_TIMEOUT\n");
    51.             break;
    52.         default:
    53.             printf("- from [1]\t-\t????");
    54.             return 1;
    55.     }
    56.  
    57.     return 0;
    58. }
    59. //---------------------------------------------------------------------
    60. DWORD WINAPI TProc2(LPVOID data)
    61. {
    62.     srand ( time(NULL) );
    63.     int sl = (rand()%10+1)*1000;// случ числа (1 ... 10) * 1000
    64.     printf("- from [2]\t-\t%d\n",sl);// получим задержку 1000 ... 9000  
    65.     Sleep (sl);    
    66.                                    
    67.     return 0;                      
    68. }
    Собирал в Dev С++, все работает.

    Еще интересно вот написано у Фролова об
    ожидании завершения нескольких задач или процессов
    http://www.frolov-lib.ru/books/bsp/v26/ch4_1.htm
     
  9. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    _sheva740
    Вот еще ,кстати,задача в этом топике сформулирована некорректно. Что понимает ТС под зависанием?
    Из-за каких особенностей? Может проще разобраться с этими самыми особенностями?
     
  10. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    AndjellaArtavazdovna
    Ну да. Дак - всему есть предел)))
    Приделом его зависания пусть будет - WAIT_4_Proc2
    )))