
- •Процессы, нити и волокна
- •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
CreateThread
Описание Функция CreateThread создает нить, которая будет выполняться в адресном пространстве вызывающего процесса. Объект созданной нити может быть использован в качестве объекта синхронизации. Он создается в несигнальном состоянии и переходит в сигнальное состояние по завершении нити. Выполнение нити начинается с функции, определяемой параметром lpStartAddr. Если эта функция возвращает значение, тогда это значение типа DWORD, которое используется для завершения нити неявным вызовом ExitThread. Для получения значения, возвращаемого нитью, применяется функция GetExitCodeThread. Нить создается с приоритетом
THREAD_PRIORITY_NORMAL. Для получения и установки значения приоритета нити применяются функции GetThreadPriority и SetThreadPriority. Объект нити остается в системе до тех пор, пока не завершится нить и не закроются все дескрипторы в результате вызова функции CloseHandle.
Синтаксис HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadSecurity, DWORD cbStack, LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpvThreadParam, DWORD dwCreateFlags, LPDWORD lpdwThreadId)
Возвращаемое значение HANDLE: Если выполнение рассматриваемой функции оказывается успешным, возвращается дескриптор нового объекта нити. В противном случае возвращается NULL. Для выборки расширенной информации об ошибке используется функция GetLastError.
Включаемый файл winbase.h
См. также CloseHandle, CreateProcess,CreateRemoteThread, ExitThread, GetExitCodeThread, GetLastError, OpenThreadToken, SetErrorMode, TerminateProcess, TerminateThread.
Пример См. пример применения функции CreateSemaphore.
EnterCriticalSection
Описание Функция EnterCriticalSection ожидает получения прав владения указанным объектом критического участка кода. Возврат из функции осуществляется после того, как права владения будут предоставлены вызывающей нити. Объекты критического участка кода вводят в действие взаимно исключающую синхронизацию нитей одного процесса. После того как нить овладеет объектом критического участка кода, она может вызвать функцию EnterCriticalSection для этого же объекта критического участка кода, что однако не приводит к ее самоблокировке. Функция LeaveCriticalSection должна вызываться столько раз, сколько нить входит в критический участок кода, прежде чем другие нити смогут получить права владения данным объектом. Чтобы разрешить взаимно исключающий доступ к разделяемому ресурсу, каждая нить обращается к EnterCriticalSection либо к TryEnterCriticalSection для запроса прав владения критическим участком кода перед выполнением любого участка кода, в котором требуется доступ к защищенному ресурсу.
Синтаксис VOID EnterCriticalSection (LPCRITICAL_SECTION lpcs)
Параметры lpcs LPCRITICAL_SECTION: Указатель на объект критического участка кода.
Включаемый файл winbase.h
См. также CreateMutex, DeleteCriticalSection, InitializeCriticalSection, LeaveCriticalSection.
Пример В приведенном ниже примере выполнение критического участка кода (ожидание в течение пяти секунд) внутри процедуры порожденной нити разрешается только одной нити. Всякий раз, когда пользователь выбирает пункт меню Test!, создается новая нить. Объект критического участка кода в процедуре этой нити упорядочивает выполнение данного участка кода.
См. \local-sources\chap25\25-07.txt
EntCrSec.h
#define IDM_EXIT 100
#define IDM_TEST 200
#define IDM_ABOUT 301
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM);
EntCrSec.rc
#include "windows.h"
#include "EntCrSec.h"
MYAPP ICON DISCARDABLE "GENERIC.ICO"
MYAPP MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", IDM_EXIT
END
MENUITEM "&Test!", IDM_TEST
POPUP "&Help"
BEGIN
MENUITEM "&About My Application...", IDM_ABOUT
END
END
ABOUTBOX DIALOG 22, 17, 171, 43
STYLE DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
CAPTION "My Application"
FONT 8, "MS Sans Serif"
{
CONTROL "MyApp", -1, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 3, 2, 16, 16
CONTROL "Generic Application", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 28, 4, 100, 8
CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 116, 26, 50, 14
}