М'ю́текс (англ. mutex, від англ. mutual exclusion — взаємне виключення) призначено для захисту певного об’єкта у потоці від доступу інших потоків. М'ютекс є одним із засобів синхронізації роботи потоків або процесів.
Загально
М'ютекси є одним з варіантів семафорних механізмів для організації взаємного виключення. Вони реалізовані в багатьох ОС, їхнє основне призначення — організація взаємного виключення для потоків з одного і того ж або різних процесів.
М'ютекси — це прості двійкові семафори, які можуть перебувати в одному з двох станів - сигнальному або несигнальному (відкритий і закритий відповідно). Коли потік отримує м'ютекс, той переводиться в несигнальний стан.
Організація послідовного доступу до ресурсів з використанням м'ютексів стає нескладною, оскільки в кожен конкретний момент тільки один потік може володіти цим об'єктом. Для того, щоб об'єкт mutex став доступний потокам, що належать різним процесам, при створенні йому необхідно присвоїти ім'я. Потім це ім'я потрібно передати «у спадок» завданням, які повинні його використовувати для взаємодії. Для цього вводяться спеціальні системні виклики (наприклад CreateMutex у Windows), в яких указується початкове значення м'ютекса і його ім'я. Для роботи з м'ютексом є кілька функцій. Крім вже згаданої функції створення такого об'єкта (CreateMutex), є функції відкриття (OpenMutex) і функція звільнення цього об'єкта (ReleaseMutex). Конкретні звернення до цих функцій і переліки передаваних і отримуваних параметрів потрібно дивитися в документації на відповідну ОС.
Порівняння м'ютексів та критичних секцій
Порівняно з критичною секцією його функціональність дещо розширена. М’ютекси можуть мати імена і дескриптори. Вони є об’єктами ядра (в той час як критичні секції належать процесу), тому їх можна використовувати для синхронізації потоків із різних процесів. Наприклад, два процеси, які розділяють спільну пам’ять через відображення файлів, можуть використовувати м’ютекс для синхронізації доступу до неї. Так як м’ютекси є об’єктами ядра і мають складнішу реалізацію, на їх обробку, як правило, витрачається більше часу порівняно з критичними секціями. Тому, якщо потрібно синхронізувати роботу потоків одного процесу, варто користуватися критичними секціями.
Робота з м'ютексами у Windows
М’ютекс перебуває в сигнальному стані тільки тоді, коли він не належить жодному із процесів. Як тільки хоча б один процес запитує володіння м’ютексом, він переходить у несигнальний стан і залишається в ньому доти, поки не буде звільнений власником. На відміну від критичних секцій, м’ютекси дозволяють задавати точний інтервал очікування, а м’ютекси, залишені закінченими процесами, автоматично переходять у сигнальний стан. Для створення м’ютекса використовується функція CreateMutex. Її опис мовою :
HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BOOL bInitialOwner, __in_opt LPCTSTR lpName )
Опис мовою Delphi:
function CreateMutex( lpMutexAttributes: PSecurityAttributes; // Атрибути доступу bInitialOwner: BOOL; // Задає, чи буде процес володіти // м’ютексом відразу після створення lpName: PChar // Ім'я м’ютекса ): THandle
Функція повертає дескриптор створеного м’ютекса (або 0 при невдалому завершенні). Якщо м’ютекс із заданим ім'ям вже існує, повертається його дескриптор. У цьому випадку функція API GetLastError поверне код помилки ERROR_ALREDY_EXISTS. Ім'я не повинно збігатися з ім'ям уже існуючого об'єкта типу Semaphore, Event, Job, Waitable Timer або File Mapping. Ім’я може мати префікс "Global\" або "Local\", які відповідно вказують на створення об’єкта у глобальному або сесійному просторі імен. Якщо невідомо, чи існує вже м’ютекс із заданим ім'ям, програма не повинна запитувати володіння об'єктом при створенні (тобто повинна передати значення false як bInitialOwner).
Якщо м’ютекс уже існує, програма може отримати його дескриптор функцією OpenMutex. Її опис на :
HANDLE WINAPI OpenMutex( __in DWORD dwDesiredAccess, __in BOOL bInheritHandle, __in LPCTSTR lpName )
Опис на Delphi:
function OpenMutex( dwDesiredAccess: DWORD; // Задає права доступу до об'єкта bInheritHandle: BOOL; // Задає, чи може об'єкт успадковуватися // дочірніми процесами lpName: PChar // Ім'я м’ютекса ): THandle
Параметр dwDesiredAccess може набувати одне з таких значень:
- MUTEX_ALL_ACCESS – програма отримує повний доступ до об'єкта;
- MUTEX_MODIFY_STATE – право змінювати стан м’ютекса (потрібне для звільнення м’ютекса функцією ReleaseMutex);
- SYNCHRONIZE – програма може використовувати об'єкт тільки у функціях очікування й функції ReleaseMutex.
Функція повертає дескриптор відкритого м’ютекса, або 0 у випадку помилки.
Потік захоплює володіння м’ютексом через виклик однієї з функцій очікування (WaitForSingleObject, WaitForMultipleObjects тощо) відносно дескриптора м’ютекса.
Вивільняється м’ютекс за допомогою функції ReleaseMutex. Її визначення на :
BOOL WINAPI ReleaseMutex(__in HANDLE hMutex);
І на Delphi:
function ReleaseMutex(hMutex: THandle): BOOL;
Приклад використання м'ютекса
Нижче приведено фрагмент коду потоку (мовою Delphi), який збільшує на 1 спільну для кількох потоків змінну А. Приклад передбачає, що існує кілька потоків, які виконують таку ж дію. Перед звертанням до спільної змінної потік очікує на звільнення м'ютекса. Якщо такої синхронізації не використовувати, то виникатиме конкуренція потоків.
const MutexName = 'IMut'; .............................. function ThreadFunc(Ptr: Pointer): LongInt; var I : integer; hIMut : THandle; begin for I := 1 to 1000000 do begin // Якийсь код hIMut := CreateMutex(0, false, MutexName); WaitForSingleObject(hIMut, INFINITE); Inc(A); ReleaseMutex(hIMut); // Якийсь код end; end;
Примітки
- Коноваленко І.В., Федорів П.С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012 [ 8 грудня 2012 у Wayback Machine.].
- . Архів оригіналу за 18 квітня 2012. Процитовано 14 травня 2012.
- . Архів оригіналу за 21 квітня 2012. Процитовано 14 травня 2012.
- . Архів оригіналу за 20 квітня 2012. Процитовано 14 травня 2012.
Див. також
- Багатонитевість
- Нить
- Синхронізація процесів
- Критична секція
- Семафор (програмування)
- Ф'ютекс, швидкий користувацький м'ютекс
- Подія (Windows)
Ця стаття потребує додаткових для поліпшення її . (січень 2016) |
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Це незавершена стаття про операційні системи. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
M yu teks angl mutex vid angl mutual exclusion vzayemne viklyuchennya priznacheno dlya zahistu pevnogo ob yekta u potoci vid dostupu inshih potokiv M yuteks ye odnim iz zasobiv sinhronizaciyi roboti potokiv abo procesiv ZagalnoM yuteksi ye odnim z variantiv semafornih mehanizmiv dlya organizaciyi vzayemnogo viklyuchennya Voni realizovani v bagatoh OS yihnye osnovne priznachennya organizaciya vzayemnogo viklyuchennya dlya potokiv z odnogo i togo zh abo riznih procesiv M yuteksi ce prosti dvijkovi semafori yaki mozhut perebuvati v odnomu z dvoh staniv signalnomu abo nesignalnomu vidkritij i zakritij vidpovidno Koli potik otrimuye m yuteks toj perevoditsya v nesignalnij stan Organizaciya poslidovnogo dostupu do resursiv z vikoristannyam m yuteksiv staye neskladnoyu oskilki v kozhen konkretnij moment tilki odin potik mozhe voloditi cim ob yektom Dlya togo shob ob yekt mutex stav dostupnij potokam sho nalezhat riznim procesam pri stvorenni jomu neobhidno prisvoyiti im ya Potim ce im ya potribno peredati u spadok zavdannyam yaki povinni jogo vikoristovuvati dlya vzayemodiyi Dlya cogo vvodyatsya specialni sistemni vikliki napriklad CreateMutex u Windows v yakih ukazuyetsya pochatkove znachennya m yuteksa i jogo im ya Dlya roboti z m yuteksom ye kilka funkcij Krim vzhe zgadanoyi funkciyi stvorennya takogo ob yekta CreateMutex ye funkciyi vidkrittya OpenMutex i funkciya zvilnennya cogo ob yekta ReleaseMutex Konkretni zvernennya do cih funkcij i pereliki peredavanih i otrimuvanih parametriv potribno divitisya v dokumentaciyi na vidpovidnu OS Porivnyannya m yuteksiv ta kritichnih sekcijPorivnyano z kritichnoyu sekciyeyu jogo funkcionalnist desho rozshirena M yuteksi mozhut mati imena i deskriptori Voni ye ob yektami yadra v toj chas yak kritichni sekciyi nalezhat procesu tomu yih mozhna vikoristovuvati dlya sinhronizaciyi potokiv iz riznih procesiv Napriklad dva procesi yaki rozdilyayut spilnu pam yat cherez vidobrazhennya fajliv mozhut vikoristovuvati m yuteks dlya sinhronizaciyi dostupu do neyi Tak yak m yuteksi ye ob yektami yadra i mayut skladnishu realizaciyu na yih obrobku yak pravilo vitrachayetsya bilshe chasu porivnyano z kritichnimi sekciyami Tomu yaksho potribno sinhronizuvati robotu potokiv odnogo procesu varto koristuvatisya kritichnimi sekciyami Robota z m yuteksami u WindowsM yuteks perebuvaye v signalnomu stani tilki todi koli vin ne nalezhit zhodnomu iz procesiv Yak tilki hocha b odin proces zapituye volodinnya m yuteksom vin perehodit u nesignalnij stan i zalishayetsya v nomu doti poki ne bude zvilnenij vlasnikom Na vidminu vid kritichnih sekcij m yuteksi dozvolyayut zadavati tochnij interval ochikuvannya a m yuteksi zalisheni zakinchenimi procesami avtomatichno perehodyat u signalnij stan Dlya stvorennya m yuteksa vikoristovuyetsya funkciya CreateMutex Yiyi opis movoyu C HANDLE WINAPI CreateMutex in opt LPSECURITY ATTRIBUTES lpMutexAttributes in BOOL bInitialOwner in opt LPCTSTR lpName Opis movoyu Delphi function CreateMutex lpMutexAttributes PSecurityAttributes Atributi dostupu bInitialOwner BOOL Zadaye chi bude proces voloditi m yuteksom vidrazu pislya stvorennya lpName PChar Im ya m yuteksa THandle Funkciya povertaye deskriptor stvorenogo m yuteksa abo 0 pri nevdalomu zavershenni Yaksho m yuteks iz zadanim im yam vzhe isnuye povertayetsya jogo deskriptor U comu vipadku funkciya API GetLastError poverne kod pomilki ERROR ALREDY EXISTS Im ya ne povinno zbigatisya z im yam uzhe isnuyuchogo ob yekta tipu Semaphore Event Job Waitable Timer abo File Mapping Im ya mozhe mati prefiks Global abo Local yaki vidpovidno vkazuyut na stvorennya ob yekta u globalnomu abo sesijnomu prostori imen Yaksho nevidomo chi isnuye vzhe m yuteks iz zadanim im yam programa ne povinna zapituvati volodinnya ob yektom pri stvorenni tobto povinna peredati znachennya false yak bInitialOwner Yaksho m yuteks uzhe isnuye programa mozhe otrimati jogo deskriptor funkciyeyu OpenMutex Yiyi opis na C HANDLE WINAPI OpenMutex in DWORD dwDesiredAccess in BOOL bInheritHandle in LPCTSTR lpName Opis na Delphi function OpenMutex dwDesiredAccess DWORD Zadaye prava dostupu do ob yekta bInheritHandle BOOL Zadaye chi mozhe ob yekt uspadkovuvatisya dochirnimi procesami lpName PChar Im ya m yuteksa THandle Parametr dwDesiredAccess mozhe nabuvati odne z takih znachen MUTEX ALL ACCESS programa otrimuye povnij dostup do ob yekta MUTEX MODIFY STATE pravo zminyuvati stan m yuteksa potribne dlya zvilnennya m yuteksa funkciyeyu ReleaseMutex SYNCHRONIZE programa mozhe vikoristovuvati ob yekt tilki u funkciyah ochikuvannya j funkciyi ReleaseMutex Funkciya povertaye deskriptor vidkritogo m yuteksa abo 0 u vipadku pomilki Potik zahoplyuye volodinnya m yuteksom cherez viklik odniyeyi z funkcij ochikuvannya WaitForSingleObject WaitForMultipleObjects tosho vidnosno deskriptora m yuteksa Vivilnyayetsya m yuteks za dopomogoyu funkciyi ReleaseMutex Yiyi viznachennya na C BOOL WINAPI ReleaseMutex in HANDLE hMutex I na Delphi function ReleaseMutex hMutex THandle BOOL Priklad vikoristannya m yuteksa Nizhche privedeno fragment kodu potoku movoyu Delphi yakij zbilshuye na 1 spilnu dlya kilkoh potokiv zminnu A Priklad peredbachaye sho isnuye kilka potokiv yaki vikonuyut taku zh diyu Pered zvertannyam do spilnoyi zminnoyi potik ochikuye na zvilnennya m yuteksa Yaksho takoyi sinhronizaciyi ne vikoristovuvati to vinikatime konkurenciya potokiv const MutexName IMut function ThreadFunc Ptr Pointer LongInt var I integer hIMut THandle begin for I 1 to 1000000 do begin Yakijs kod hIMut CreateMutex 0 false MutexName WaitForSingleObject hIMut INFINITE Inc A ReleaseMutex hIMut Yakijs kod end end PrimitkiKonovalenko I V Fedoriv P S Sistemne programuvannya u Windows z prikladami na Delphi T TNTU 2012 8 grudnya 2012 u Wayback Machine Arhiv originalu za 18 kvitnya 2012 Procitovano 14 travnya 2012 Arhiv originalu za 21 kvitnya 2012 Procitovano 14 travnya 2012 Arhiv originalu za 20 kvitnya 2012 Procitovano 14 travnya 2012 Div takozhBagatonitevist Nit Sinhronizaciya procesiv Kritichna sekciya Semafor programuvannya F yuteks shvidkij koristuvackij m yuteks Podiya Windows Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno sichen 2016 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Ce nezavershena stattya pro operacijni sistemi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi