получение дескриптора потока

Тема в разделе "WASM.WIN32", создана пользователем vadak, 19 мар 2011.

  1. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Категорически приветствую всех участников форума!
    Вообщем пытаюсь написать многопоточный сервер, и по ходу дела столкнулся с такой неожиданностью. При пошаговой отладке многопоточного приложения(в моем случае), во время создания дочернего потока, хэндл его равняется 0x3d8, хотя при нормальном выполнении программы хэндл = 0x28. Просто непонятно на какие данные опираться, какие ложные, а какие нет.

    Код (Text):
    1. #include <iostream>
    2. #include <windows.h>
    3. #include <process.h>
    4. #include <stdio.h>
    5. #include <conio.h>
    6. using namespace std;
    7.  
    8. UINT WINAPI server_thread(LPVOID hThread)
    9. {
    10.     cout <<"Thread is start..."<<endl;
    11.     Sleep(3000);
    12.     cout <<"Thread is end..."<<endl;
    13.     return 0;
    14. }
    15. int main(void)
    16. {
    17.  
    18.     HANDLE hThread;
    19.     UINT IDThread;
    20.     char i[100];
    21.  
    22.     hThread =(HANDLE)_beginthreadex(
    23.             NULL,
    24.             0,
    25.             server_thread,
    26.             NULL,
    27.             0,
    28.             &IDThread);
    29.  
    30.     printf("Handle thread: %d\n", (int)hThread);
    31.     gets((char *)i);
    32.     return 0;
    33. }
    компилятор: Mingw
    IDE: Code::Blocks
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Откуда мысли, что здесь есть ложные данные?
     
  3. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Ну значения дескриптора различны (0x3d8 и 0x28), при пошаговой отладке выводится на консоль одно, а при обычном выполнении, другое. Вот что мне не ясно.
     
  4. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    Почему хендл потока должен быть один и тот же при разных запусках?
    Зачем вам нужно опираться на какое либо конкретно значение хендла?
     
  5. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    оо как все запущено..
     
  6. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Затем, чтобы заносить хэндлы потоков в массив, с последующей их обработкой.
    И вот еще что я заметил: при использовании функции CreateThread вместо _beginthreadex,
    функция может возвратить отрицательное значение хэндла, это нормально?

    т.е. мне не нужно обращать внимание на значение хэндлов, а просто сохранять их а затем использовать, так что ли?
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    MSDN читаем по поводу функции CreateThread... -1 - это INVALID_HANDLE_VALUE, что свидетельствует об ошибке, подробности можно узнать функцией GetLastError... _beginthreadex внутри себя вызывает CreateThread, проводя при этом определенные CRT инициализации... если проект серьезно завязан на CRT, то лучше использовать _beginthreadex... и еще по сабжу: хендлы могут быть разными от запуска к запуску, если функция не вернула ошибку - значит и хендл валидный...
     
  8. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Благодарю за содержательный ответ Rel!
    Сейчас кое-что проясняется :)