Категорически приветствую всех участников форума! Вообщем пытаюсь написать многопоточный сервер, и по ходу дела столкнулся с такой неожиданностью. При пошаговой отладке многопоточного приложения(в моем случае), во время создания дочернего потока, хэндл его равняется 0x3d8, хотя при нормальном выполнении программы хэндл = 0x28. Просто непонятно на какие данные опираться, какие ложные, а какие нет. Код (Text): #include <iostream> #include <windows.h> #include <process.h> #include <stdio.h> #include <conio.h> using namespace std; UINT WINAPI server_thread(LPVOID hThread) { cout <<"Thread is start..."<<endl; Sleep(3000); cout <<"Thread is end..."<<endl; return 0; } int main(void) { HANDLE hThread; UINT IDThread; char i[100]; hThread =(HANDLE)_beginthreadex( NULL, 0, server_thread, NULL, 0, &IDThread); printf("Handle thread: %d\n", (int)hThread); gets((char *)i); return 0; } компилятор: Mingw IDE: Code::Blocks
Ну значения дескриптора различны (0x3d8 и 0x28), при пошаговой отладке выводится на консоль одно, а при обычном выполнении, другое. Вот что мне не ясно.
Почему хендл потока должен быть один и тот же при разных запусках? Зачем вам нужно опираться на какое либо конкретно значение хендла?
Затем, чтобы заносить хэндлы потоков в массив, с последующей их обработкой. И вот еще что я заметил: при использовании функции CreateThread вместо _beginthreadex, функция может возвратить отрицательное значение хэндла, это нормально? т.е. мне не нужно обращать внимание на значение хэндлов, а просто сохранять их а затем использовать, так что ли?
MSDN читаем по поводу функции CreateThread... -1 - это INVALID_HANDLE_VALUE, что свидетельствует об ошибке, подробности можно узнать функцией GetLastError... _beginthreadex внутри себя вызывает CreateThread, проводя при этом определенные CRT инициализации... если проект серьезно завязан на CRT, то лучше использовать _beginthreadex... и еще по сабжу: хендлы могут быть разными от запуска к запуску, если функция не вернула ошибку - значит и хендл валидный...