Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС Laba2 Саттаров РР.doc
Скачиваний:
7
Добавлен:
29.07.2019
Размер:
97.79 Кб
Скачать
  1. Какие параметры можно передавать в функцию потока?

Параметр psa является указателем на структуру SECURITY_ATTRIBUTES. Значение NULL – атрибуты защиты по умолчанию. Чтобы дочерние процессы смогли наследовать описатель этого объекта, определите структуру SECURITY_ATTRIBUTES и инициализируйте ее элемент hlnheritHandle значением TRUE.

Параметр cbStack определяет, какую часть адресного пространства поток сможет использовать под свой стек. Значение 0 - CreateThread создает стек для нового потока, используя информацию, встроенную компоновщиком в ЕХЕ-файл. Смотрите ключ компоновщика -

/STACK.[reserve] [,commit]

Аргумент reserve определяет объем адресного пространства, который система должна зарезервировать под стек потока (по умолчанию — 1 Мб). Аргумент commit задает объем физической памяти, который изначально передается области, зарезервированной под стек (по умолчанию — 1 страница).

Параметр pfnStartAddr определяет адрес функции потока, с которой должен будет начать работу создаваемый поток, а параметр pvParam идентичен параметру рvРаrаm функции потока. CreateThread лишь передает этот параметр по эстафете той функции, с которой начинается выполнение создаваемого потока. Таким образом, данный параметр позволяет передавать функции потока какое-либо инициализирующее значение. Оно может быть или просто числовым значением, или указателем на структуру данных с дополнительной информацией. Вполне допустимо и даже полезно создавать несколько потоков, у которых в качестве входной точки используется адрес одной и той же функции. Например, можно реализовать Web-сервер, который обрабатывает каждый клиентский запрос в отдельном потоке. При создании каждому потоку передается свое значение рvParam.

Параметр fdwCreate определяет дополнительные флаги, управляющие созданием потока. Он принимает одно из двух значений. 0 (исполнение потока начинается немедленно) или CREATE_SUSPENDED. В последнем случае система создает поток, инициализирует его и приостанавливает до последующих указаний. Флаг CREATE_SUSPENDED позволяет программе изменить какие-либо свойства потока перед тем, как он начнет выполнять код. Правда, необходимость в этом возникает довольно редко.

Последний параметр pdwThreadID функции CreateThread — это адрес переменной типа DWORD, в которой функция возвращает идентификатор, приписанный системой новому потоку. В Windows 2000 и Windows NT 4 в этом параметре можно передавать NULL (обычно так и делается). В Windows 95/98 это приведет к ошибке, так как функция попытается записать идентификатор потока пo нулевому адресу, что недопустимо. И поток не будет создан.

  1. Как запускаются потоки? Как запустить поток в приостановленном

состоянии?

Для создания потоков в Windows предусмотрена функция:

HANDLE CreateThread(

   PSECURITY_ATTRIBUTES psa, // атрибуты защиты

   DWORD cbStack, // размер стека потока

   PTHREAD_START_ROUTINE pfnStartAddr, // адрес функции потока

   PVOID pvParam, // параметр для передачи в функцию потока

   DWORD fdwCreate, // флаги создания потока

   PDWORD pdwThreadID); // адрес для идентификатора потока

При каждом вызове этой функции система создает объект ядра «поток». Это не сам поток, а компактная структура данных, которая используется операционной системой для управления потоком и хранит статистическую информацию о потоке. Так что объект ядра «поток» — полный аналог объекта ядра «процесс».

Система выделяет память под стек потока из адресного пространства процесса. Новый поток выполняется в контексте того же процесса, что и родительский поток. Поэтому он получает доступ ко всем описателям объектов ядра, всей памяти и стекам всех потоков в процессе. За счет этого потоки в рамках одного процесса могут легко взаимодействовать друг с другом.