Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows


Некоторые соображения по библиотеке С/С++ - часть 4


if (thdl == NULl) {
// создать поток не удалось, проводится очистка и сообщается об ошибке
goto error_return;
}

// поток успешно создан; возвращается его описатель
return(thdl);

error_return:
// ошибка! не удалось создать блок данных или сам поток
_free_crt(ptd);

return((unsigned long)0L);

}

Несколько важных моментов, связанных с _beginthreadex

  • Каждый поток получает свой блок памяти tiddata, выделяемый из кучи, кото рая принадлежит библиотеке С/Г++ (Структура tiddata определена в файле Mtdll h. Она довольно любопытна, и я привел ее на рис 6-2 )
  • Адрес функции потока, переданный _beginthreadex, запоминается в блоке па мяти tiddata Там же сохраняется и параметр, который должен быть передан этой функции
  • Функция _beginthreadex вызывает CreateThread, так как лишь с ее помощью операционная система может создать новый поток
  • При вызове CreateThread сообщается, что она должна начагъ выполнение но вого потока с функции _threadstartex, а не с того адреса, на который указыва ет fnStartAddr Кроме тою, функции потока передается не параметр рvParam а адрес структуры tiddata
  • Если все проходит успешно, beginthreadex, как и CreateThread, возвращает описатель потока В ином случае возвращается NULL

    struct tiddata
    {
    unsigned long _tid; /* идентификатор потока */
    unsigned long _thandle; /* описатель потока */
    int terrno; /* значение errno */
    unsigned long tdoserrno; /* значение _doserrno */
    unsigned int _fpds; /* сегмент данных Floating Point */
    unsigned lonq _holdrand; /* зародышевое значение для rand() */
    char * _token; /* указатель (ptr) на метку strtok() */

    #ifdef _WIN32
    wchar_t *_wtoken; /* ptr на метку wcstok() */
    #endif /* _WIN32 */

    unsigned char * _mtoken; /* ptr на метку _mbstok() */

    /* следующие указатели обрабатываются функцией malloc в период выполнения */
    char * _errmsg; /* ptr на буфер strerror()/_strerror() */
    char * _namebuf0; /* ptr на буфер tmpnam() */

    #ifdef _WIN32
    wchar_t * _wnarnebuf0; /* ptr на буфер_wtmpnam() */
    #endif /* _WIN32 */

    char * _namebuf1 /* ptr на буфер tmpfile() */




    Начало  Назад  Вперед



    Книжный магазин