АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Объекты «мьютекс»

Читайте также:
  1. VII. По степени завершенности процесса воздействия на объекты защиты
  2. А. Объекты авторского права
  3. Авторское право: понятие, объекты и субъекты
  4. Б. Животные и незрелые в половом отношении лица как сексуальные объекты
  5. Базовые объекты ОС
  6. Безопасность – понятие, опасность и риск, объекты, субъекты безопасности, критерии безопасности, виды безоп., системы безоп. и их характеристика
  7. Бухгалтерский учет: понятия, объекты учета, принципы, основные задачи и организация
  8. Важные объекты УФПС «Почты России»
  9. Вещи как объекты гражданских прав, их классификации. Ценные бумаги, их виды.
  10. Вещи как объекты гражданских правоотношений
  11. Вещи как объекты гражданских правоотношений.
  12. Водные объекты рыбохозяйственного значения Новгородской области

Мьютекс (MUTual Exclusions— взаимоисключения) - это объект ядра, который можно использовать для синхронизации потоков из разных процессов. Он может принадлежать или не принадлежать не­которому потоку. Если мьютекс принадлежит потоку, то он находится в состоя­нии «занято». Если данный объект не относится ни к одному потоку, то он нахо­дится в состоянии «свободно». Другими словами, принадлежать для него означает быть в состоянии «занято».

Если мьютекс не принадлежит ни одному потоку, первый поток, который вы­зовет функцию WaitForSingleObject, завладевает данным объектом, и тот переходит в состояние «занято». В определенном смысле мьютекс похож на вык­лючатель, которым может пользоваться любой поток по принципу «первым при­шел - первым обслужили» (first-come-first,-served).

Дело в том, что при попытке с помощью вызова функции WaitForSingleObject завладеть мьютексом, который уже находится в состоянии «занято», поток пере­водится в состояние ожидания до того момента, когда данный объект освободит­ся, то есть когда «владелец» мьютекса его освободит (переведет в состояние «сво­бодно»).

По принципу своего действия мьютексы очень похожи на критические секции, за исключением двух моментов. Во-первых, мьютексы можно использовать для синхронизации потоков, переступая через границы процессов. Во-вторых, мьютексу можно присвоить имя и путем ссылки на это имя создать дополнительные дескрипторы существующих объектов мьютексов.

Мьютексы создаются с помощью вызова функции CreateMutex:

 

HANDLE CreateMutexi

LPSECURITY_ATTRIBUTES IpMutexAttributes,

// Указатель на атрибуты защиты.

BOOL bInitialOwner, // флаг первоначального владельца.

LPCTSTR IpName // Указатель на имя мьютекса.
);

в Delphi:

 

function CreateMutex(lpMutexAttributes: PSecurityAttributes; bInitialOwner: BOOL; lpName: PChar): THandle;

 

Параметр IpMutexAttributes — это указатель на запись типа TSecurityftttributes. Обычно в качестве данного параметра передастся значение nil, и в этом случае используются атрибуты защиты, действующие по умолчанию.

Параметр blnitialOwner определяет, следует ли считать поток, создающий мьютекс, его владельцем. Если этот параметр равен False, значит, мьютекс не имеет владельца.

Параметр IpName представляет имя мыотскса. Если вы не собираетесь присваивать мьютексу имя, установите этот параметр равным nil. Если же значение этого параметра отлично от nil, функция выполнит в системе поиск мьютекса с таким же именем. При успешном завершении поиска функция вернет дескриптор найденного мьютекса, в противном случае возвращается дескриптор нового мьютекса. При наличии имени этот объект мо­жет совместно использоваться несколькими процессами. Если каким-то процес­сом создается мьютекс с именем, то поток другого процесса может вызывать функции CreateMutex или OpenMutex с тем же самым именем. В любом случае система просто передаст вызывающему потоку дескриптор исходного мьютекса. Другой способ совместно использовать мьютекс - вызвать функцию DuplicateHandle.

Чтобы работать с несколькими процессами, данный объект должен быть совместно используемым. Причина проста: чтобы завладеть мьютексом или освободить его, потоку потребуется его дескриптор. Поток освобождает этот объект с помощью вызова функции ReleaseMutex:,

 

BOOL ReleaseMutex(

HANDLE hMutex // Дескриптор мьютекса.

);

в Delphi:

 

function ReleaseMutex(hMutex: THandle): BOOL; stdcall;

 

А что случится, если владеющий мьютексом поток завершится, предварительно не освободив его? В действительности система сама освобождает такой мьютекс. Поток, который вызывает функцию WaitForSingleObject для этого объекта, получит возвращенное значение WAIT_ABANDONED, которое указывает на возник­шие проблемы с только что завершимся потоком-владельцем. В этом случае ждущий поток должен определить, стоит продолжать выполнение в обычном режиме или нет.

По завершении использования мьютекса необходимо закрыть его с помощью функции Win32 API CloseHandle().

 


1 | 2 | 3 | 4 | 5 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)