Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория / Теория / ОСиСП ответы на некоторые вопросы.doc
Скачиваний:
81
Добавлен:
11.05.2015
Размер:
1.38 Mб
Скачать

Контекст потока.

На рис. 6-1 показано, что именно должна сделать система, чтобы создать и инициализировать поток. Давайте приглядимся к этой схеме повнимательнее.

Вызов CreateThread заставляет систему создать объект ядра «поток». При этом, счетчику числа его пользователей присваивается начальное значение, равное 2. (Объект ядра "по ток" уничтожается только после того, как прекращается выполнение потока и закрывается описатель, возвращенный функцией CreateThread)

Также, инициализируются другие свойства этого объекта: счетчик числа простоев (suspension count) получает значение 1, а код завершения — значение STILL_ACTIVE (0x103) И, наконец, объект переводится в состояние "занято».

Создав объект ядра "поток», система выделяет стеку потока память из адресного пространства процесса и записывает в его самую верхнюю часть два значения (Стеки потоков всегда строятся от старших адресов памяти к младшим). Первое из них является значением параметра pvParam, переданного Вами функции CreateThread, а второе — это содержимое параметра pfnStartAddr, который Вы тоже передаете в CreateThread

Рис. 6-1. Так создается и инициализируется поток

У каждого потока собственный набор регистров процессора, называемый контекстом потока. Контекст отражает состояние регистров процессора на момент последнего исполнения потока и записывается в структуру CONTEXT (она определена в заголовочном файле WinNT.h). Эта структура содержится в объекте ядра «поток».

Указатель команд (IP) и указатель стека (SP) — два самых важных регистра в контексте потока. Вспомните: потоки выполняются в контексте процесса. Соответственно эти регистры всегда указывают на адреса памяти в адресном пространстве процесса. Когда система инициализирует объект ядра "поток", указателю стека в структуре CONTEXT присваивается тот адрес, по которому в стек потока было записано значение pfnStartAddr, а указателю команд — адрес недокументированной (и неэкспортируемой) функции BaseThreadStart. Эта функция содержится в модуле Kernel32.dll, где, кстати, реализована и функция CreateThread.

Вопрос 17: Синхронизация потоков одного и того же процесса. Критические секции. Спин-блокировки. Interlocked-функции. Синхронизация потоков одного и того же процесса.

Согласно концепции Windows объекты ядра могут находиться в одном из двух состояний:

  1. Свободном состоянии (signaled)

  2. Занятом (not signaled)

Поток дожидается освобождения объекта ядра с помощью одной из двух функций:

DWORD WaitForSingleObject(

HANDLE hHandle, // handle to object

DWORD dwMilliseconds // time-out interval

);

Поток усыпляет себя на заданный вторым параметром промежуток времени или до освобождения объекта идентифицированного первым параметром.

Функция возвращает управление, если:

  1. объект стал свободным

  2. истек заданный промежуток времени

В момент возврата управления потоку, вызвавшему функцию ожидания, объект ядра переводится в занятое состояние (это не относится к событиям со сбросом вручную – этот объект ядра не переводится автоматически).

DWORD WaitForMultipleObjects(

DWORD nCount, // number of handles in array

CONST HANDLE *lpHandles, // object-handle array

BOOL bWaitAll, // wait option

DWORD dwMilliseconds // time-out interval

);

Позволяет дождаться освобождения списка объектов. Или одного из группы (параметр WaitAll). В массиве дескрипторов нельзя указывать один и тот же дескриптор несколько раз.

Для последнего параметра TimeOut в обеих функциях можно указать значение INFINITE.

В этом случае функции ожидают объекты бесконечно. Эти функции возвращают одно из следующих значений:

WAIT_ABANDONED

The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread, and the mutex is set to nonsignaled. Только для Mutex.

WAIT_OBJECT_0

The state of the specified object is signaled.

WAIT_TIMEOUT

The time-out interval elapsed, and the object's state is nonsignaled. Функция завершилась по таймауту.

WAIT_FAILED

Неправильное завершение

WAIT_OBJECT_N (N – номер объекта в списке).

В Windows, независимо от объекта синхронизации, существует универсальный механизм синхронизации, основанный на использовании двух функций.

Все объекты синхронизации отличаются лишь механизмом своей работы, но не тем, как происходит синхронизация.