М'ютекс, семафор, критичні секції

Синхронізація об'єктів: м'ютекс, семафор, критичні секції

Критичні секції забезпечують синхронізацію подібно м'ютексів (про м'ютексів див. Далі) за винятком того, що об'єкти, що представляють критичні секції, доступні в межах одного процесу. Події, м'ютекси і семафори також можна використовувати в "однопроцессной" додатку, однак критичні секції забезпечують більш швидкий і більш ефективний механізм взаємно-яка виключає синхронізації. Подібно м'ютексів об'єкт, який представляє критичну секцію, може використовуватися тільки одним потоком в даний момент часу, що робить їх вкрай корисними при розмежуванні доступу до загальних ресурсів. Важко припустити що-небудь про порядок, в якому потоки будуть отримувати доступ до ресурсу, можна сказати лише, що система буде "справедлива" до всіх потоків.

М'ютекс (взаємовиключення, mutex) - це об'єкт синхронізації, який встановлюється в особливу сигнальний стан, коли чи не зайнятий будь-яким потоком. Тільки один потік володіє цим об'єктом в будь-який момент часу, звідси і назва таких об'єктів - одночасний доступ до загального ресурсу виключається. Наприклад, щоб виключити запис двох потоків в загальний ділянку пам'яті в один і той же час, кожен потік чекає, коли звільниться м'ютекс, стає його власником і тільки потім пише що-небудь в цю ділянку пам'яті. Після всіх необхідних дій м'ютекс звільняється, надаючи іншим потокам доступ до загального ресурсу.

Два (або більше) процесу можуть створити м'ютекс з одним і тим же ім'ям, викликавши метод CreateMutex. Перший процес дійсно створює м'ютекс, а наступні процеси отримують хендл вже існуючого об'єкта. Це дає можливість декільком процесам отримати хендл одного і того ж мьютекса, звільняючи програміста від необхідності піклуватися про те, хто насправді створює м'ютекс. Якщо використовується такий підхід, бажано встановити прапор bInitialOwner в FALSE, інакше виникнуть певні труднощі при визначенні дійсного творця мьютекса.

Кілька процесів можуть отримати хендл одного і того ж мьютекса, що робить можливим взаємодія між процесами. Ви можете використовувати наступні механізми такого підходу:

Дочірній процес, створений за допомогою функції CreateProcess може успадковувати хендл мьютекса в разі, якщо при його (мьютекса) створенні Функ CreateMutex був вказаний параметр lpMutexAttributes.

Процес може отримати дублікат існуючого мьютекса за допомогою функції DuplicateHandle.

Процес може вказати ім'я існуючого мьютекса при виклику функцій OpenMutex або CreateMutex.

Взагалі кажучи, якщо ви синхронізуєте потоки одного процесу, більш ефективним підходом є використання критичних секцій.

Схожі статті