![](/user_photo/2706_HbeT2.jpg)
- •Процессы, нити и волокна
- •CrProces.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •Объекты синхронизации
- •Защита процесса от нереентрабельного кода
- •Описание функций управления процессами, нитями и волокнами
- •CreateEvent
- •CrEvent.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •CreateMutex
- •CrMutex.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •CreateSemaphore
- •CrSem.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •CreateThread
- •EnterCriticalSection
- •EntCrSec.C
- •Int apientry WinMain( hinstance hInstance, hinstance hPrevInstance,
- •ExitThread
- •InitializeCriticalSection
- •DeleteCriticalSection
- •LeaveCriticalSection
- •OpenSemaphore
- •TryEnterCriticalSection
- •WaitForMultipleObjects
Защита процесса от нереентрабельного кода
В связи с тем что глобальные данные процесса разделяются среди всех нитей, потребуется принять меры предосторожности во избежание конфликтов при доступе к данным, которые могли бы привести к сбою программы. Одним из средств, реализованных в Win32 API для защиты от нереентрабельного кода, является объект критического участка кода. Критический участок кода (critical section) представляет собой такой объект, который используется только для синхронизации нитей одного процесса. Объект критического участка кода создается с помощью функции InitializeCriticalSection.
После создания объекта критического участка кода для получения доступа к защищенному коду в нити необходимо использовать функцию EnterCriticalSection интерфейса API. Если в пределах критического участка кода выполняется другая нить, тогда нить, запрашивающая доступ к критическому участку кода, должна ожидать до тех пор, пока нить, владеющая данным объектом, не уступит свои права на него, обратившись для этого к LeaveCriticalSection.
Описание функций управления процессами, нитями и волокнами
Все функции интерфейса Win32 API, предназначенные для управления процессами, нитями и волокнами, перечислены в табл. 3.
Таблица 3. Сводка функций управления процессами, нитями и волокнами
Функция |
Назначение |
Attach Threadlnput |
Переадресует ввод из одной нити в другую нить |
CancelWartableTimer |
Отменяет таймер ожидания, устанавливая его в неактивное состояние |
CovertThreadToFiber |
Преобразует текущую нить в волокно |
CreateEvent |
Создает объект события |
CreateFiber |
Создает объект волокна |
CreafeMutex |
Создает объект мьютекса |
CreateProcess |
Создает объект процесса и нити и запускает процесс |
CreateProcessAsUser |
Создает объект процесса и нити в контексте защиты, установленной для данного пользователя |
CreateRemoteThread |
Создает нить, которая выполняется в адресном пространстве другого процесса |
CreateSemaphore |
Создает объект семафора |
CreateThread |
Создает объект нити и запускает нить |
Create WaitableTimer |
Создает объект таймера ожидания |
DeleteCriticalSection |
Удаляет неактивный объект критического участка кода |
DeleteFiber |
Удаляет объект волокна |
DuplicateHandle |
Копирует дескриптор любого объекта с тем, чтобы он мог использоваться другим процессом |
EnterCriticalSection |
Проверяет логическое состояние критического участка кода, и если им никто не владеет, осуществляется вход в этот участок кода |
ExitProcess |
Завершает процесс и все нити процесса и возвращает код завершения |
ExitThread |
Завершает одну нить процесса |
GetCurrentFiber |
Возвращает текущее волокно нити |
GetCurrentProcess |
Возвращает дескриптор текущего процесса |
GetCurrentProcessID |
Возвращает идентификатор текущего процесса |
GetCurrentThread |
Возвращает дескриптор текущей нити |
GetCurrentThreadID |
Возвращает идентификатор текущей нити |
GetExitCodeProcess |
Возвращает код завершения указанного процесса. Эта функция может также использоваться для установления факта завершения процесса |
GetExitCodeThread |
Возвращает код завершения указанной нити. Эта функция может также использоваться для установления факта завершения нити |
GetFiberData |
Возвращает данные, связанные с объектом волокна |
GelPriorityClass |
Определяет класс приоритета процесса |
GetProcessAffinityMask |
Возвращает маску родства процесса |
GetProcessHeap |
Возвращает дескриптор кучи вызывающего процесса |
GetProcessHeaps |
Возвращает массив дескрипторов, которые содержат все кучи, принадлежащие вызывающему процессу |
GetProcessPriorityBoost |
Возвращает повышение приоритета для процесса |
GetProcessShutdownParameters |
Возвращает параметры закрытия процесса |
GetProcessTimes |
Возвращает временные характеристики выполнения процесса |
GetProcessVersion |
Возвращает ожидаемую процессом версию Windows |
GetProcessWorkingSetSize |
Возвращает размер рабочего множества для процесса |
GetQueueStatus |
Возвращает входное состояние очереди нити |
Функция |
Назначение |
GetThreadContext |
Используется отладчиком для сохранения машинного контекста нити |
GetThreadPriority |
Возвращает класс приоритета данной нити |
GetThreadPriorityBoost |
Возвращает повышение приоритета нити |
GetThreadSelectorEntry |
Используется отладчиком для возврата элемента локальной таблицы дескрипторов (LDT) по заданному адресу сегмента указанной нити |
GetThreadTimes |
Возвращает временные характеристики выполнения нити |
InitializeCrrticalSection |
Создает объект критического участка кода для защиты части мультинитевого процесса от одновременного выполнения нескольких нитей |
InterlockedCompareExchange |
Сравнивает длинные значения синхронизированных переменных |
InterlockedDecrement |
Уменьшает длинное значение синхронизированной переменной |
InterlockedExchange |
Меняет местами указанное значение и длинное значение синхронизированной переменной |
InterlockedExchangeAdd |
Прибавляет указанное значение к длинному значению синхронизированной переменной |
Interlockedlncrement |
Увеличивает длинное значение синхронизированной переменной |
LeaveCriticalSection |
Отмечает конец кода, защищенного объектом критического участка кода |
MsgWaitForMultipleObjects |
Выполняет возврат, когда любые или все объекты переходят в сигнальное состояние, конкретный тип входных данных появляется во входной очереди указанной нити либо истекает время ожидания |
MsgWaitForMultipieObjectsEx |
То же, что и функция MsgWaitForMuitipleObjects, за исключением того, что к возврату из данной функции приводит также завершение ввода-вывода или асинхронный вызов процедуры (АРС) |
OpenEvent |
Возвращает дескриптор именованного объекта события |
OpenMutex |
Возвращает дескриптор именованного объекта мьютекса |
OpenProcess |
Возвращает дескриптор указанного объекта |
OpenSemaphore |
Возвращает дескриптор поименованного объекта семафора |
OpenWaitableTimer |
Возвращает дескриптор объекта таймера ожидания |
PulseEvent |
Переводит событие из несигнального в сигнальное состояние, а затем опять в несигнальное состояние. Эта функция применяется для освобождения ожидающих нитей и повторной установки блока событий |
QueueUserAPC |
Размещает в очереди АРС указанной нити объект асинхронного вызова процедуры (АРС) из пользовательского режима |
RaiseException |
Сигнализирует нити о программно формируемом исключении, которое может быть обработано приложением. Функция RaiseException применяется также в качестве канала связи с отладчиком |
ReadProcessMemory |
Читает содержимое памяти из адресного пространства процесса |
RegisterHotKey |
Создает оперативную клавишу для данной нити |
ReleaseMutex |
Возвращает мьютекс в сигнальное состояние |
ReleaseSemaphore |
Увеличивает счетчик семафора |
ResetEvent |
Переводит событие в несигнальное состояние |
ResumeThread |
Возобновляет выполнение приостановленной нити |
SetEvent |
Переводит событие в сигнальное состояние |
SetPriorityClass |
Устанавливает класс приоритета процесса |
SetProcessAffinityMask |
Устанавливает маску родства процесса |
SetProcessPriorityBoost |
Устанавливает повышение приоритета для процесса |
SetProcessShufdownParameters |
Устанавливает параметры закрытия процесса |
SetProcessWorkingSetSize |
Устанавливает размер рабочего множества для процесса |
SetThreadAffinityMask |
Устанавливает маску родства нити |
SetThreadContext |
Устанавливает контекст нити |
SetThreadldealProcessor |
Устанавливает идеальный процессор для нити |
SetThreadPriority |
Устанавливает класс приоритета нити |
SetThreadPriorityBoost |
Устанавливает повышение приоритета для нити |
SetUnhandledExceptionFilter |
Разрешает приложению установить процедуру перехвата необработанных исключений |
SetWartableTimer |
Активизирует объект таймера ожидания |
SignalObjectAndWait |
Переводит один объект в сигнальное состояние и ожидает перехода в сигнальное состояние другого объекта |
Sleep |
Приостанавливает выполнение нити на заданный промежуток в миллисекундах. При этом может быть запланировано выполнение другой нити |
SleepEx |
То же что и Sleep за исключением того, что к возврату из данной функции может также привести завершение ввода-вывода или асинхронный вызов процедуры (АРС) |
SuspendThread |
Приостанавливает выполнение процесса |
SwitchToFiber |
Планирует запуск волокна |
TerminateProcess |
Завершает процесс |
TerminateThread |
Завершает выполнение нити |
TIsAlloc |
Выделяет индекс локальной памяти нити |
TIsFree |
Освобождает индекс локальной памяти нити |
TIsGetValue |
Возвращает объект памяти, назначенный для локальной памяти нити по указанному индексу |
TIsGetValue |
Устанавливает объект памяти, назначенный для локальной памяти нити по указанному индексу |
Функция |
Назначение |
TryEnterCrrticalSection |
Пытается войти в критический участок кода, и если это удается, то приобретает права владения критическим участком кода |
UnhandledExceptionFiter |
Вызывает используемый по умолчанию фильтр необработанных сообщений или отладчик, если данная программа отлаживается |
UnregisteredHotKey |
Удаляет оперативную клавишу нити |
WattForlnputldle |
Ожидает до тех пор, пока для нити не завершится ввод |
WaitForMultipleObjects |
Ожидает перехода в сигнальное состояние одного или более указанных объектов синхронизации |
WaitForMultipleObjectsEx |
То же, что и функция WaitForMultipleObjects, за исключением того, что к возврату из данной функции может также привести завершение ввода-вывода или асинхронный вызов процедуры (АРС) |
WaitForSingleObject |
Ожидает перехода в сигнальное состояние одного объекта синхронизации |
WaitForSingleObjectEx |
То же, что и функция WaitForSingleObject, за исключением того, что к возврату из данной функции может также привести завершение ввода-вывода или асинхронный вызов процедуры (АРС) |
WriteProcessMemory |
Используется, главным образом, отладчиком для непосредственной записи данных в память процесса |