У каждого потока собственный набор регистров процессора, называемый контекстом потока.
Эта структура с именем CONTEXT отражает состояние регистров процессора на момент последнего исполнения потока. Когда потоку выделяется процессорное время, система инициализирует регистры процессора содержимым контекста и, разумеется, регистр — указатель команд идентифицирует адрес следующей машинной команды, необходимой для выполнения потока.
Кроме того, в контекст включается указатель стека, который определяет адрес стека" принадлежащего потоку. Получить сведения о текущем состоянии регистров процессора. можно с помощью функции:
BOOL GetThreadContext (HANDLE hThread, PCONTEXT pContext);
В программе (результатах) это выглядит так:
CONTEXT ct; ct. ContextFlags = (CONTEXT_FULL);
if (!GetThreadContext (hThread, &ct)) {return FALSE; }.
Рисунок 2 — Контекст первого потока.
Создание потока
Для создания потока используется функция CreateThread. В программе поток 1 создается следующим образом:
hThread1 = CreateThread (NULL, 0, First_Thread, hDlg, CREATE_SUSPENDED, &Id1);
Как и при работе с функцией CreateProcess, для многих параметров можно задавать значения по умолчанию (@ или NULL). Третий параметр не может иметь значение по умолчанию, ему всегда передается адрес функции потока. Четвертый параметр часто используется для организации взаимосвязи вызывающего потока с дочерним потоком. При каждом вызове функции CreateThread система создает объект ядра «поток» с начальным значением счетчика его пользователей, равным единице. Система выделяет память под стек потока из адресного пространства процесса. Новый поток выполняется в адресном пространстве того же процесса, что и родительский поток.