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


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


Вот главное, что делает BaseThreadStart:

VOID BaseThreadStart(PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam)
{

__try
{
ExitThread((pfnStartAddr)(pvParam));
}

_except(UnhandledExceptionFilter(GetExceptionInformation()))
{
ExitProcess(GetExceptionCode());
}

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

После инициализации потока система проверяет, был ли передан функции Create Thread флаг CREATE_SUSPENDED Если нет, система обнуляет его счетчик числа про стоев, и потоку может быть выделено процессорное время. Далее система загружает в регистры процессора значения, сохраненные в контексте потока С этого момента поток может выполнять код и манипулировать данными в адресном пространстве своего процесса.

Поскольку указатель команд нового потока установлен на BaseThreadStart, имен но с этой функции и начнется выполнение потока. Глядя на ее прототип, можно по думать, будто BaseThreadStart передаются два параметра, а значит, она вызывается из какой-то другой функции, но это не так. Новый поток просто начинает с нее свою работу. BaseThreadStart получает доступ к двум параметрам, которые появляются у нее потому, что операционная система записывает соответствующие значения в стек по тока (а через него параметры как раз и передаются функциям), Правда, на некоторых аппаратных платформах параметры передаются не через стек, а с использованием определенных регистров процессора Поэтому на таких аппаратных платформах система — прежде чем разрешить потоку выполнение функции BaseThreadStart — инициализирует нужные регистры процессора.

Когда новый поток выполняет BaseThreadStart, происходит следующее.

  • Ваша функция потока включается во фрейм структурной обработки исключе ний (далее для краткости — SEH-фрейм), благодаря чему любое исключение, если оно происходит в момент выполнения Вашего потока, получает хоть ка кую-то обработку, предлагаемую системой по умолчанию. Подробнее о струк турной обработке исключений см. главы 23, 24 и 25.
  • Система обращается к Вашей функции потока, передавая ей параметр pvParam, который Вы ранее передали функции CreateTbread



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



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