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


Кое-что о внутреннем устройстве потока - часть 3


  • Когда Ваша функция потока возвращает управление, BaseThreadStart вspывает ExitThread, передавая ей значение, возвращенное Вашей функцией. Счетчик числа пользователей объекта ядра "поток» уменьшается на 1, и выполнение потока прекращается
    • Если Ваш поток вызывает необрабатываемое им исключение, его обрабатыва ет SEH-фрейм, построенный функцией BaseThreadStart Обычно в результате этого появляется окно с каким-нибудь сообщением, и, когда пользователь зак рывает его, BaseThreadStart вызывает ExitProcess и завершает весь процесс, а не только тот ноток, в котором произошло исключение.

    Обратите внимание, что из BaseThreadStart поток вызывает либо ExitThread, либо ExitProcess А это означает, что поток никогда не выходит из данной функции; он все гда уничтожается внутри нее. Вот почему BaseThreadStart нет возвращаемого значе ния — она просто ничего не возвращает.

    Кстати, именно благодаря BaseThreadStart Ваша функция потока получает возмож ность вернуть управление по окончании своей работы. BaseThteadSlart, вызывая фун кцию потока, заталкивает в стек свой адрес возврята и тсм самым сообщает ей, куда надо вернуться. Но сама BaseThreadStart не возвращает управление. Иначе возникло бы нарушение доступа, так как в стеке потока нет ее адреса возврата.

    При инициализации первичного потока его указатель команд устанавливается на другую недокументированную функцию — BaseProcessStart Она почти идентична BaseThreadStart и выглядит примерно так:

    VOID BaseProcessStart(PPROCESS_START_BOUTINE pfnStartAddr)
    {

    __try
    {
    ExitThread((pfnStartAdd r)());
    }

    _except(UnhandledFxceptionFilter(GetExceptionInformation()))
    {
    ExitProcess(GettxceptionCode());
    }

    // ПРИМЕЧАНИЕ, мы никогда не попадем сюда
    }

    Единственное различие между этими функциями в отсутствии ссылки на параметр pvParam. Функция BaseProcessStart обращается к стартовому коду библиотеки С/С++, который выполняет необходимую инициализацию, а затем вызывает Ramy входную функцию main, wmain, WinMain или wWinMain. Когда входная функция возвращает управление, стартовый код библиотеки С/С++ вызываст ExitProcess. Поэтому первич ный поток приложения, написанного на С/С++, никогда не возвращается в Base ProcessStart.




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



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