Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Написать программу создания процессов



void main ( VOID ){

STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory ( & si, sizeof (si) );

si.cb = sizeof (si);

ZeroMemory( & pi, sizeof( pi ) ); // Запустим дочерний процесс.

if (! CreateProcess ( NULL, // Нет имени модуля (используется командная строка).

" MyChildProcess ", // Командная строка.

NULL, // Дескриптор процесса не наследуемый.

NULL, // Дескриптор потока не наследуемый.

FALSE, // Установим наследование дескриптора в FALSE.

0, // Флажков создания нет.

NULL, // Используйте блок конфигурации родителя.

NULL, // Используйте стартовый каталог родителя.

& si, // Указатель на структуру STARTUPINFO.

& pi ) // Указатель на структуру PROCESS_INFORMATION.

) ErrorExit ( " CreateProcess failed. " );

// Ждать до тех пор, пока дочерний процесс не выйдет из работы.

WaitForSingleObject ( pi.hProcess, INFINITE ); // Закроем дескрипторы процесса и потока.

CloseHandle ( pi.hProcess );

CloseHandle ( pi.hThread );

}

 

 

3.1 Объекты-взаимоисключения (мьютексы, mutex - от MUTual EXclusion) позволяют координировать взаимное исключение доступа к разделяемому ресурсу. Сигнальное состояние объекта (т.е. состояние " установлен" ) соответствует моменту времени, когда объект не принадлежит ни одной нити и его можно " захватить". И наоборот, состояние " сброшен" (не сигнальное) соответствует моменту, когда какая-либо нить уже владеет этим объектом. Доступ к объекту разрешается, когда нить, владеющая объектом, освободит его.

Две (или более) нити могут создать мьютекс с одним и тем же именем, вызвав функцию CreateMutex. Первая нить действительно создает мьютекс, а следующие - получают дескриптор уже существующего объекта. Это дает возможность нескольким нитям получить дескриптор одного и того же мьютекса, освобождая программиста от необходимости заботиться о том, кто в действительности создает мьютекс. Если используется такой подход, желательно установить флаг bInitialOwner в FALSE, иначе возникнут определенные трудности при определении действительного создателя мьютекса.

Несколько нитей могут получить дескриптор одного и того же мьютекса, что делает возможным взаимодействие между процессами. Можно использовать следующие механизмы такого подхода:

· Дочерний процесс, созданный при помощи функции CreateProcess может наследовать дескриптор мьютекса в случае, если при создании мьютекса функцией CreateMutex был указан параметр lpMutexAttributes.

· Нить может получить дубликат существующего мьютекса с помощью функции DuplicateHandle.

· Нить может указать имя существующего мьютекса при вызове функций OpenMutex или CreateMutex.

Для того чтобы объявить взаимоисключение принадлежащим текущей нити, надо вызвать одну из ожидающих функций. Нить, которой принадлежит объект, может его " захватывать" повторно сколько угодно раз (это не приведет к самоблокировке), но столько же раз она должна будет его освобождать с помощью функции ReleaseMutex.

 

Управление потоками. API-функций для работы с потоками

Определение потока связано с последовательностью действий процессора во время исполнения программы. Такая последовательность выполнения инструкций программы называется потоком управления внутри программы.

Программа является многопоточной, если в ней может одновременно существовать несколько потоков. Потоки в этом случае называются параллельными. Если в программе одновременно может существовать только один поток, то такая программа называется однопотонной.

API функци и для работы с потоками

Создание потоков

Создается поток функцией CreateThread, которая имеет следующий прототип:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // атрибутызащиты

DWORD dwStackSize, // размер стека потока в байтах

LPTHREAD_START_ROUTINE IpStartAddress, // адресфункции

LPVOID lpParameter, // адреспараметра

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

LPDWORD lpThreadld // идентификатор потока

Возвращаемое значение: дескриптор созданного потока и его идентификатор или null при неудаче.

Параметр lpStartAddress указывает на исполняемую потоком функцию. Эта функция должна иметь следующий прототип:

DWORDWINAPIимя_функции_потока(LPVOIDlpParameters);

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

Параметр dwCreationFiags определяет, в каком состоянии будет создан поток.

Завершение потоков

Поток завершается вызовом функции ExitThread, которая имеет следующий прототип:

VOID ExitThread(

DWORD dwExitCode // код завершения потока );

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

Один поток может завершить другой поток, вызвав функцию TerminateThread, которая имеет следующий прототип:

BOOL TerminateThread(

HANDLE hThread, // дескрипторпотока

DWORD dwExitThread // код завершения потока );

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


Поделиться:



Последнее изменение этой страницы: 2019-04-09; Просмотров: 240; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.017 с.)
Главная | Случайная страница | Обратная связь