Синхронізація процесів в інформатиці — приведення двох або декількох процесів або потоків (нитей) до такого їхнього протікання, коли певні стадії різних процесів здійснюються в певному порядку, або одночасно, для уникнення конкуренції потоків або взаємного блокування. Загальна ідея полягає в тому, що в певних точках процесам необхідно разом домовитися про певний порядок дій зі спільними ресурсами.
Синхронізація необхідна у випадках, коли паралельно протікаючим процесам (або потокам одного процесу) необхідна взаємодія.
Засоби синхронізації
Найпоширеніші засоби синхронізації такі:
Синхронізація у Windows
Для синхронізації потоків у Windows передбачено ряд функцій синхронізації.
Синхронізація з одним об'єктом
Найпростішою функцією, яка очікує завершення переходу заданого об’єкта у сигнальний стан, є WaitForSingleObject.
Її опис мовою :
DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, __in DWORD dwMilliseconds );
Опис мовою Delphi:
function WaitForSingleObject( hHandle: THandle; // Дескриптор об’єкта dwMilliseconds: DWORD // Час очікування ): DWORD;
Функція очікує переходу об'єкта з дескриптором hHandle у сигнальний стан протягом dwMilliseconds мілісекунд. Якщо цим параметром передати значення INFINITE, функція буде чекати протягом необмеженого часу. Якщо dwMilliseconds дорівнює 0, то функція перевіряє стан об'єкта й негайно повертає керування. Дескриптор повинен бути відкритий з правом доступу SYNCHRONIZE.
Функція повертає одне з перелічених у таблиці значень.
Значення | Опис |
---|---|
WAIT_OBJECT_0 | Об'єкт перейшов у сигнальний стан |
WAIT_ABANDONED | Означає, що заданий об’єкт є м'ютексом, і потік, який володів ним, завершився, не звільнивши його. Власником м'ютекса стає викликаючий потік, а сам м'ютекс переводиться у несигнальний стан |
WAIT_TIMEOUT | Вийшов час очікування |
WAIT_FAILED | Відбулася помилка (наприклад, невірне значення hHandle) |
Приклад використання функції WaitForSingleObject
Тут подано приклад коду, який створює новий процес, запускаючи стандартний текстовий редактор "Блокнот" (Notepad), і чекає на його завершення (приклад подано мовою Delphi).
var PI : TProcessInformation; SI : TStartupInfo; begin (* ............................ *) FillChar(SI, Sizeof(SI), #0); SI.cb := SizeOf(SI); if not CreateProcess('c:\windows\system32\notepad.exe', nil, nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then MessageBox(Handle, 'Не вдалося створити процес.', '', MB_OK or MB_ICONERROR); WaitForSingleObject(PI.hProcess, INFINITE);
Синхронізація кількох об'єктів
Для синхронізації кількох об'єктів використовують фунцію API WaitForMultipleObjects. ЇЇ опис мовою :
DWORD WINAPI WaitForMultipleObjects( __in DWORD nCount, __in const HANDLE *lpHandles, __in BOOL bWaitAll, __in DWORD dwMilliseconds );
Опис мовою Delphi:
function WaitForMultipleObjects( nCount: DWORD; // Кількість об’єктів lpHandles: PWOHandleArray; // Адреса масиву об’єктів bWaitAll: BOOL; // Чи чекати всі об’єкти dwMilliseconds: DWORD // Період очікування ): DWORD;
Вказівник lpHandles посилається на масив, який містить дескриптори об’єктів очікування. Параметр nCount задає кількість елементів цього масиву. Якщо параметру bWaitAll задати значення true, функція очікуватиме на перехід у сигнальний стан усіх перелічених у масиві lpHandles об’єктів. Коли цей параметр дорівнює false, функція чекатиме на сигнальний стан одного з них. Параметр dwMilliseconds задає час очікування (як для функції WaitForSingleObject). Дескриптори повинні мати право доступу SYNCHRONIZE. Функція повертає одне з перелічених у таблиці значень.
Значення | Опис | |
---|---|---|
Число в діапазоні від WAIT_OBJECT_0 до WAIT_OBJECT_0 + nCount – 1 | Якщо bWaitAll дорівнює true, то це число означає, що всі об’єкти перейшли у сигнальний стан. Якщо false, то віднявши від отриманого значення WAIT_OBJECT_0, отримаємо індекс елемента масиву lpHandles, який перейшов у сигнальний стан | |
Число в діапазоні від WAIT_ABANDONED_0 до WAIT_ABANDONED_0 + nCount – 1 | Якщо bWaitAll дорівнює true, то це означає, що всі об’єкти перейшли у сигнальний стан, але хоча б один з потоків, який володів ними, завершився, залишивши м'ютекс. Якщо false, то віднявши від результату значення WAIT_ABANDONED_0, отримаємо індекс елемента масиву lpHandles, який відповідає залишеному м'ютексу. Власником м'ютекса стає викликаючий потік, а сам м'ютекс переводиться у несигнальний стан | |
WAIT_TIMEOUT | Вийшов час очікування | |
WAIT_FAILED | Сталася помилка |
Приклад очікування кількох об'єктів
Очікування на завершення роботи трьох потоків з відомими дескрипторами (hThreadX) можна реалізувати так (код мовою Delphi):
var Handles : array[0..2] of THandle; ............................................ Handles[0] := hThread1; Handles[1] := hThread2; Handles[2] := hThread3; WaitForMultipleObjects(3, @Handles, true, INFINITE);
Очікування з обробкою повідомлень
Функції WaitForSingleObject та WaitForMultipleObjects повністю зупиняють роботу викликаючого потоку, включаючи й стандартну обробку повідомлень графічної підсистеми Windows, тому програма не може навіть перемалювати своє вікно.
Тому функції WaitForSingleObject та WaitForMultipleObjects варто використовувати, коли час очікування невеликий. Якщо ж затримка значна, слід дати можливість програмі обробляти деякі системні повідомлення. Для цього можна використати функцію MsgWaitForMultipleObjects. Її опис мовою :
DWORD WINAPI MsgWaitForMultipleObjects( __in DWORD nCount, __in const HANDLE *pHandles, __in BOOL bWaitAll, __in DWORD dwMilliseconds, __in DWORD dwWakeMask );
Опис мовою Delphi:
function MsgWaitForMultipleObjects( nCount: DWORD; // Кількість об’єктів синхронізації var pHandles; // Адреса масиву об’єктів fWaitAll: BOOL; // Чи чекати на всі об’єкти dwMilliseconds, // Період очікування dwWakeMask: DWORD // Тип події, яка перериває очікування ): DWORD;
Основна відмінність цієї функції від функції WaitForMultipleObjects – параметр dwWakeMask, який є комбінацією бітових прапорів QS_XXX і задає типи повідомлень, які перериватимуть очікування незалежно від стану очікуваних об'єктів. Наприклад, маска QS_KEY дозволяє перервати очікування з появою в черзі повідомлень від клавіатури, маска QS_MOUSE забезпечує реакцію на повідомлення миші, а маска QS_PAINT – повідомлення перемальовування WM_PAINT. З появою в черзі викликаючого потоку повідомлень, які відповідають заданій масці, функція повертає значення WAIT_OBJECT_0 + nCount. Отримавши таке значення, програма може обробити його й знову викликати функцію очікування.
Примітки
- MSDN: WaitForSingleObject function.
- Коноваленко І.В., Федорів П.С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012.
- MSDN: WaitForMultipleObjects function.
- MSDN: MsgWaitForMultipleObjects function.
Дивись також
- Багатонитевість
- Нить
- Критична секція
- Семафор (програмування)
- М'ютекс
- Ф'ютекс, швидкий користувацький м'ютекс
- Подія (Windows)
Ця стаття потребує додаткових для поліпшення її . (січень 2016) |
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Це незавершена стаття про операційні системи. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina Sinhronizaciya informatika Sinhronizaciya procesiv v informatici privedennya dvoh abo dekilkoh procesiv abo potokiv nitej do takogo yihnogo protikannya koli pevni stadiyi riznih procesiv zdijsnyuyutsya v pevnomu poryadku abo odnochasno dlya uniknennya konkurenciyi potokiv abo vzayemnogo blokuvannya Zagalna ideya polyagaye v tomu sho v pevnih tochkah procesam neobhidno razom domovitisya pro pevnij poryadok dij zi spilnimi resursami Sinhronizaciya neobhidna u vipadkah koli paralelno protikayuchim procesam abo potokam odnogo procesu neobhidna vzayemodiya Zasobi sinhronizaciyiNajposhirenishi zasobi sinhronizaciyi taki signali i kritichni sekciyi m yuteksi semafori podiyi bar yeri kanali angl pipe Sinhronizaciya u WindowsDlya sinhronizaciyi potokiv u Windows peredbacheno ryad funkcij sinhronizaciyi Sinhronizaciya z odnim ob yektom Najprostishoyu funkciyeyu yaka ochikuye zavershennya perehodu zadanogo ob yekta u signalnij stan ye WaitForSingleObject Yiyi opis movoyu C DWORD WINAPI WaitForSingleObject in HANDLE hHandle in DWORD dwMilliseconds Opis movoyu Delphi function WaitForSingleObject hHandle THandle Deskriptor ob yekta dwMilliseconds DWORD Chas ochikuvannya DWORD Funkciya ochikuye perehodu ob yekta z deskriptorom hHandle u signalnij stan protyagom dwMilliseconds milisekund Yaksho cim parametrom peredati znachennya INFINITE funkciya bude chekati protyagom neobmezhenogo chasu Yaksho dwMilliseconds dorivnyuye 0 to funkciya pereviryaye stan ob yekta j negajno povertaye keruvannya Deskriptor povinen buti vidkritij z pravom dostupu SYNCHRONIZE Funkciya povertaye odne z perelichenih u tablici znachen Znachennya Opis WAIT OBJECT 0 Ob yekt perejshov u signalnij stan WAIT ABANDONED Oznachaye sho zadanij ob yekt ye m yuteksom i potik yakij volodiv nim zavershivsya ne zvilnivshi jogo Vlasnikom m yuteksa staye viklikayuchij potik a sam m yuteks perevoditsya u nesignalnij stan WAIT TIMEOUT Vijshov chas ochikuvannya WAIT FAILED Vidbulasya pomilka napriklad nevirne znachennya hHandle Priklad vikoristannya funkciyi WaitForSingleObject Tut podano priklad kodu yakij stvoryuye novij proces zapuskayuchi standartnij tekstovij redaktor Bloknot Notepad i chekaye na jogo zavershennya priklad podano movoyu Delphi var PI TProcessInformation SI TStartupInfo begin FillChar SI Sizeof SI 0 SI cb SizeOf SI if not CreateProcess c windows system32 notepad exe nil nil nil false NORMAL PRIORITY CLASS nil nil SI PI then MessageBox Handle Ne vdalosya stvoriti proces MB OK or MB ICONERROR WaitForSingleObject PI hProcess INFINITE Sinhronizaciya kilkoh ob yektiv Dlya sinhronizaciyi kilkoh ob yektiv vikoristovuyut funciyu API WaitForMultipleObjects YiYi opis movoyu C DWORD WINAPI WaitForMultipleObjects in DWORD nCount in const HANDLE lpHandles in BOOL bWaitAll in DWORD dwMilliseconds Opis movoyu Delphi function WaitForMultipleObjects nCount DWORD Kilkist ob yektiv lpHandles PWOHandleArray Adresa masivu ob yektiv bWaitAll BOOL Chi chekati vsi ob yekti dwMilliseconds DWORD Period ochikuvannya DWORD Vkazivnik lpHandles posilayetsya na masiv yakij mistit deskriptori ob yektiv ochikuvannya Parametr nCount zadaye kilkist elementiv cogo masivu Yaksho parametru bWaitAll zadati znachennya true funkciya ochikuvatime na perehid u signalnij stan usih perelichenih u masivi lpHandles ob yektiv Koli cej parametr dorivnyuye false funkciya chekatime na signalnij stan odnogo z nih Parametr dwMilliseconds zadaye chas ochikuvannya yak dlya funkciyi WaitForSingleObject Deskriptori povinni mati pravo dostupu SYNCHRONIZE Funkciya povertaye odne z perelichenih u tablici znachen Znachennya Opis Chislo v diapazoni vid WAIT OBJECT 0 do WAIT OBJECT 0 nCount 1 Yaksho bWaitAll dorivnyuye true to ce chislo oznachaye sho vsi ob yekti perejshli u signalnij stan Yaksho false to vidnyavshi vid otrimanogo znachennya WAIT OBJECT 0 otrimayemo indeks elementa masivu lpHandles yakij perejshov u signalnij stan Chislo v diapazoni vid WAIT ABANDONED 0 do WAIT ABANDONED 0 nCount 1 Yaksho bWaitAll dorivnyuye true to ce oznachaye sho vsi ob yekti perejshli u signalnij stan ale hocha b odin z potokiv yakij volodiv nimi zavershivsya zalishivshi m yuteks Yaksho false to vidnyavshi vid rezultatu znachennya WAIT ABANDONED 0 otrimayemo indeks elementa masivu lpHandles yakij vidpovidaye zalishenomu m yuteksu Vlasnikom m yuteksa staye viklikayuchij potik a sam m yuteks perevoditsya u nesignalnij stan WAIT TIMEOUT Vijshov chas ochikuvannya WAIT FAILED Stalasya pomilka Priklad ochikuvannya kilkoh ob yektiv Ochikuvannya na zavershennya roboti troh potokiv z vidomimi deskriptorami hThreadX mozhna realizuvati tak kod movoyu Delphi var Handles array 0 2 of THandle Handles 0 hThread1 Handles 1 hThread2 Handles 2 hThread3 WaitForMultipleObjects 3 Handles true INFINITE Ochikuvannya z obrobkoyu povidomlen Funkciyi WaitForSingleObject ta WaitForMultipleObjects povnistyu zupinyayut robotu viklikayuchogo potoku vklyuchayuchi j standartnu obrobku povidomlen grafichnoyi pidsistemi Windows tomu programa ne mozhe navit peremalyuvati svoye vikno Tomu funkciyi WaitForSingleObject ta WaitForMultipleObjects varto vikoristovuvati koli chas ochikuvannya nevelikij Yaksho zh zatrimka znachna slid dati mozhlivist programi obroblyati deyaki sistemni povidomlennya Dlya cogo mozhna vikoristati funkciyu MsgWaitForMultipleObjects Yiyi opis movoyu C DWORD WINAPI MsgWaitForMultipleObjects in DWORD nCount in const HANDLE pHandles in BOOL bWaitAll in DWORD dwMilliseconds in DWORD dwWakeMask Opis movoyu Delphi function MsgWaitForMultipleObjects nCount DWORD Kilkist ob yektiv sinhronizaciyi var pHandles Adresa masivu ob yektiv fWaitAll BOOL Chi chekati na vsi ob yekti dwMilliseconds Period ochikuvannya dwWakeMask DWORD Tip podiyi yaka pererivaye ochikuvannya DWORD Osnovna vidminnist ciyeyi funkciyi vid funkciyi WaitForMultipleObjects parametr dwWakeMask yakij ye kombinaciyeyu bitovih praporiv QS XXX i zadaye tipi povidomlen yaki pererivatimut ochikuvannya nezalezhno vid stanu ochikuvanih ob yektiv Napriklad maska QS KEY dozvolyaye perervati ochikuvannya z poyavoyu v cherzi povidomlen vid klaviaturi maska QS MOUSE zabezpechuye reakciyu na povidomlennya mishi a maska QS PAINT povidomlennya peremalovuvannya WM PAINT Z poyavoyu v cherzi viklikayuchogo potoku povidomlen yaki vidpovidayut zadanij masci funkciya povertaye znachennya WAIT OBJECT 0 nCount Otrimavshi take znachennya programa mozhe obrobiti jogo j znovu viklikati funkciyu ochikuvannya PrimitkiMSDN WaitForSingleObject function Konovalenko I V Fedoriv P S Sistemne programuvannya u Windows z prikladami na Delphi T TNTU 2012 MSDN WaitForMultipleObjects function MSDN MsgWaitForMultipleObjects function Divis takozhBagatonitevist Nit Kritichna sekciya Semafor programuvannya M yuteks 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