
- •Процессы, нити и волокна
- •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
CreateEvent
Описание Функция CreateEvent создает поименованный или безымянный объект события, который может программным путем быть переведен в сигнальное или несигнальное состояние с помощью функции SetEvent. События используются в приложении для уведомления нитей о соответствующих действиях, а также для синхронизации нитей. Например, одна нить создает событие и устанавливает его в несигнальное состояние. Другая нить использует дескриптор события, полученный с помощью функции WaitFor-SingleObject, для ожидания момента перехода этого события в сигнальное состояние. После того как первая нить установит событие в сигнальное состояние, вторая нить продолжит свое выполнение.
Синтаксис HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpSecurityAttribs, BOOL bManualReset, BOOL nInitialState, LPCTSTR lpszEventName)
Возвращаемое значение HANDLE: Если выполнение рассматриваемой функции оказывается успешным, возвращается дескриптор объекта события. В противном случае возвращается NULL. Если же поименованный объект события существовал до вызова рассматриваемой функции, функция GetLastError возвращает код ошибки ERROR_ALREADY_EXIST, а иначе - 0.
Включаемый файл winbase.h
См. также CreateProcess, DuplicateHandle, OpenEvent, ResetEvent, SetEvent, WaitForSingleObject, WaitForMultipleObjects.
Пример В приведенном ниже примере показано, каким образом сбрасываемые вручную события и семафоры используются для написания синхронизированного кода, предназначенного для управления доступом процесса к ресурсам. Имеются четыре пункта меню: Read, Write, Quit и Help. Чтобы было удобнее наблюдать за тем, как действует синхронизация, необходимо запустить на выполнение три экземпляра приложения и расположить их на рабочем столе без перекрытий. Затем в двух экземплярах следует выбрать пункт меню Read, а в третьем экземпляре – пункт меню Write. Между читающими процессами конфликт отсутствует, однако записывающий процесс должен ожидать до тех пор, пока читающие процессы не завершатся, прежде чем продолжить свое выполнение. Далее следует выбрать операцию записи и две операции чтения. В этом случае операции чтения должны ожидать до тех пор, пока не завершится операция записи. Текущее состояние каждого процесса отображается в строке заголовка соответствующего экземпляра приложения.
CrEvent.h
#define IDM_EXIT 100
#define IDM_READ 200
#define IDM_WRITE 201
#define IDM_ABOUT 301
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM);
CrEvent.rc
#include "windows.h"
#include "CrEvent.h"
MYAPP ICON DISCARDABLE "GENERIC.ICO"
MYAPP MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&Read", IDM_READ
MENUITEM "&Write", IDM_WRITE
MENUITEM SEPARATOR
MENUITEM "E&xit", IDM_EXIT
END
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
}