if ((ptd = _calloc_crt(1, sizeof(struct tiddata))) == NULl)
goto error_returnж
// инициализация блока данных
initptd(ptd);
// здесь запоминается нужная функция потока и параметр,
// который мы хотим поместить в блок данных
ptd->_initaddr = (void *) pfnStartAddr;
ptd->_initarg = pvParam;
// создание Honoio потока
thdl = (unsigned long)
CreateThread(psa, cbStack, _threadstartex, (PVOID) ptd, fdwCreate, pdwThrcadID);
if (thdl == NULl) {
// создать поток не удалось, проводится очистка и сообщается об ошибке
goto error_return;
}
// поток успешно создан; возвращается его описатель
return(thdl);
error_return:
// ошибка! не удалось создать блок данных или сам поток
_free_crt(ptd);
return((unsigned long)0L);
}
Несколько важных моментов, связанных с _beginthreadex
struct tiddata
{
unsigned long _tid; /* идентификатор потока */
unsigned long _thandle; /* описатель потока */
int terrno; /* значение errno */
unsigned long tdoserrno; /* значение _doserrno */
unsigned int _fpds; /* сегмент данных Floating Point */
unsigned lonq _holdrand; /* зародышевое значение для rand() */