Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода Процессы и потоки.doc
Скачиваний:
7
Добавлен:
14.07.2019
Размер:
401.92 Кб
Скачать

CreateMutex

Описание Функция CreateMutex создает поименованный или безымянный объект мьютекса, который используется для синхронизации процессов. Мьютекс переходит в сигнальное состояние, когда он не принадлежит ни одной из нитей. Нить, которой мьютекс принадлежит, может указать один и тот же мьютекс в повторяющихся вызовах функции ожидания, не блокируя свое выполнение. Как правило, по отношению к одному и тому же мьютексу это не делается, однако такой способ препятствует самоблокировке нити, когда она ожидает мьютекс, который ей уже принадлежит. Чтобы уступить свои права на мьютекс, нить должна обратиться к функции ReleaseMutex в момент, когда мьютекс удовлетворяет условие ожидания. Возвращаемый рассматриваемой функцией дескриптор имеет доступ типа MUTEX_ALL_ACCESS к новому мьютексу и может использоваться в лю­бой функции, которой требуется дескриптор мьютекса. Любая нить вызы­вающего процесса может указать дескриптор мьютекса при вызове одной из функций ожидания. Для закрытия мьютекса, когда он уже больше не нужен, применяется функция CloseHandle. Когда все открытые дескрипто­ры мьютекса закрываются, мьютекс удаляется.

Синтаксис HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpSecurityAttribs, BOOL bInitialOwner, LPCTSTR lpszMutexName)

Возвращаемое значение HANDLE: Если выполнение рассматриваемой функции успешно, возвращается дескриптор объекта мьютекса. В противном случае возвращается NULL. Если поименованный объект мьютекса уже существовал до вызо­ва рассматриваемой функции, GetLastError возвращает код ошибки ERROR_ALREADY_EXIST; в противном случае возвращается 0. Для вы­борки расширенной информации об ошибке используется функция Get­LastError.

Включаемый файл 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

}