- •Процессы, нити и волокна
- •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
CreateMutex
Описание Функция CreateMutex создает поименованный или безымянный объект мьютекса, который используется для синхронизации процессов. Мьютекс переходит в сигнальное состояние, когда он не принадлежит ни одной из нитей. Нить, которой мьютекс принадлежит, может указать один и тот же мьютекс в повторяющихся вызовах функции ожидания, не блокируя свое выполнение. Как правило, по отношению к одному и тому же мьютексу это не делается, однако такой способ препятствует самоблокировке нити, когда она ожидает мьютекс, который ей уже принадлежит. Чтобы уступить свои права на мьютекс, нить должна обратиться к функции ReleaseMutex в момент, когда мьютекс удовлетворяет условие ожидания. Возвращаемый рассматриваемой функцией дескриптор имеет доступ типа MUTEX_ALL_ACCESS к новому мьютексу и может использоваться в любой функции, которой требуется дескриптор мьютекса. Любая нить вызывающего процесса может указать дескриптор мьютекса при вызове одной из функций ожидания. Для закрытия мьютекса, когда он уже больше не нужен, применяется функция CloseHandle. Когда все открытые дескрипторы мьютекса закрываются, мьютекс удаляется.
Синтаксис HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpSecurityAttribs, BOOL bInitialOwner, LPCTSTR lpszMutexName)
Возвращаемое значение HANDLE: Если выполнение рассматриваемой функции успешно, возвращается дескриптор объекта мьютекса. В противном случае возвращается NULL. Если поименованный объект мьютекса уже существовал до вызова рассматриваемой функции, GetLastError возвращает код ошибки ERROR_ALREADY_EXIST; в противном случае возвращается 0. Для выборки расширенной информации об ошибке используется функция GetLastError.
Включаемый файл winbase.h
См. также CreateProcess, DuplicateHandle, OpenMutex, ReleaseMutex, WaitForSingleObject, WaitForMultipleObjects.
Пример В приведенном ниже простом примере демонстрируется применение мьютексов. Когда выбирается пункт меню Test!, начинает свое выполнение нить, которая ожидает доступа к мьютексу, переходя в неактивное состояние, а затем освобождает мьютекс. А при выборе пункт меню Test! несколько раз демонстрируется конфликт нитей за обладание мьютексом. В данном случае мьютекс вынуждает нити выполняться последовательно.
См. \local-sources\chap25\25-03.txt
CrMutex.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);
CrMutex.rc
#include "windows.h"
#include "CrMutex.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
}