Windows для профессионалов


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


главы 23, 24 и 25.
  • Система обращается к Вашей функции потока, передавая ей параметр pvParam, который Вы ранее передали функции CreateTbread.
  • Когда Ваша функция потока возвращает управление, 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 обращается к стартовому коду библиотеки С/С++, который выполняет необходимую инициализацию, а затем вызывает Вaшy входную функцию main, wmain, WinMain или wWinMain.Когда входная функция возвращает управление, стартовый код библиотеки С/С++ вызываст ExitProcess. Поэтому первичный поток приложения, написанного на С/С++, никогда не возвращается в Base ProcessStart.




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



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