Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка 2.doc
Скачиваний:
18
Добавлен:
13.02.2015
Размер:
1.23 Mб
Скачать

-18-

Лабораторная работа № 2 потоки и работа с ними в операционной системе windows

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

Теоретические сведения

  1. Создание потока

Функция CreateThread создает поток, который выполняется в пределах виртуального адресного пространства вызывающего процесса.

Чтобы создавать поток, который запускается в виртуальном адресном пространстве другого процесса, используется функция CreateRemoteThread.

Синтаксис

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // дескриптор защиты SIZE_T dwStackSize, // начальный размер стека LPTHREAD_START_ROUTINE lpStartAddress, // функция потока LPVOID lpParameter, // параметр потока DWORD dwCreationFlags, // опции создания LPDWORD lpThreadId // идентификатор потока

);

Параметры

  1. lpThreadAttributes – указатель на структуру SECURITY_ATTRIBUTES, которая обуславливает, может ли возвращенный дескриптор быть унаследован дочерними процессами. Если lpThreadAttributes является значением ПУСТО (NULL), дескриптор не может быть унаследован. Windows NT/2000/XP: член структуры lpSecurityDescriptor определяет дескриптор безопасности для нового потока. Если lpThreadAttributes имеет значение ПУСТО (NULL), поток получает заданный по умолчанию дескриптор защиты. Списки контроля доступа (ACL) в заданном по умолчанию дескрипторе безопасности для потока поступают из первичного маркера или маркера заимствования прав создателя.

  2. dwStackSize – начальный размер стека, в байтах. Система округляет это значение до самой близкой страницы памяти. Если это значение нулевое, новый поток использует по умолчанию размер стека исполняемой программы.

  3. lpStartAddress – указатель на определяемую программой функцию типа LPTHREAD_START_ROUTINE, код которой исполняется потоком и обозначает начальный адрес потока.

  4. lpParameter – указатель на переменную, которая передается в поток.

  5. dwCreationFlags – флажки, которые управляют созданием потока. Если установлен флажок CREATE_SUSPENDED, создается поток в состоянии ожидания и не запускается до тех пор, пока не будет вызвана функция ResumeThread. Если это значение нулевое, поток запускается немедленно после создания. В это время, никакие другие значения не поддерживаются.

Если в Windows XP и выше установлен флажок STACK_SIZE_PARAM_IS_A_RESERVATION, параметр dwStackSize задает начальный резервный размер стека. Иначе, dwStackSize устанавливает фиксированный размер.

  1. lpThreadId – указатель на переменную, которая принимает идентификатор потока. Если этот параметр имеет значение ПУСТО (NULL), идентификатор потока не возвращается. В Windows 95/98/Me Этот параметр не может быть значением ПУСТО (NULL).

Возвращаемые значения

Если функция завершается успешно, величина возвращаемого значения будет равна дескриптору нового потока.

Если функция завершается с ошибкой, величина возвращаемого значения - ПУСТО (NULL). Чтобы получать дополнительные информацию об ошибке необходимо вызвать функцию GetLastError.

Число потоков, которые процесс может создать, ограничено доступной виртуальной памятью. По умолчанию, каждый поток имеет один мегабайт пространства стека. Поэтому, Вы можете создавать самое большое 2028 потоков. Если Вы преобразовываете заданный по умолчанию размер стека, Вы можете создавать большее количество потоков. Однако ваше приложение будет иметь лучшую эффективность, если Вы создаете один поток на процессор и выстраиваете очередь запросов, которые приложение сохраняют информацию контекста. Поток должен обрабатывать все запросы в очереди перед обработкой запросов следующей очереди.