Критична секція

Критична секція (англ. critical section) — об'єкт синхронізації потоків у Windows, що дозволяє запобігти одночасному виконанню деякого критичного набору операцій (зазвичай пов'язаних з доступом до даних) кількома потоками.

Загально

Об'єкт критичної секції представляє ділянку сирцевого коду, яка в кожен окремий момент може виконуватися лише одним потоком. Критичні секції можна створювати і знищувати, але вони не мають дескрипторів, тому не можуть використовуватись різними процесами. У той же час, для синхронізації потоків одного процесу критичні секції – один з найшвидших і найпростіших способів. Об'єкти критичних секцій не є об'єктами ядра, а розміщуються у користувацькому адресному просторі процесу[1].

В більшості реалізацій з кожною критичною секцією пов'язано лічильник, і захоплення критичної секції можливе лише за нульового значення цього лічильника. Захоплення означає атомарну зміну лічильника на 1. Щоразу, коли потік, що володіє критичною секцією, знов входить до неї, лічильник збільшується на 1, при виході — зменшується. Перехід до чекання на події ядра здійснюється лише у випадку, якщо значення змінної лічильника до спроби захоплення було вже більше 1, тобто критична секція зайнята і є реальне «змагання» двох або більше потоків за ресурс критичної секції.

Аналогічний об'єкт в Linux називається ф'ютекс.

Порівняння критичних секцій та м'ютексів

Критична секція значною мірою виконує ті ж завдання, що і м'ютекс.

У операційних системах Microsoft Windows головна відмінність між м'ютексом і критичною секцією в тому, що м'ютекс є об'єктом ядра і може бути використаний кількома процесами одночасно, критична секція ж належить процесу і служить для синхронізації тільки його потоків. Процедура входу і виходу критичних секцій зазвичай займає менший час, ніж аналогічні операції м'ютекса.

Між м'ютексом і критичною секцією є й термінологічні відмінності. Процедура, аналогічна захопленню м'ютекса, називається входом у критичну секцію, зняття блокування м'ютекса — виходом з критичної секції.

Робота з критичними секціями у Windows

Для роботи з критичними секціями використовують Windows API.

Перед використання критичної секції її слід ініціалізувати за допомогою процедури InitializeCriticalSection. Її опис мовою C[2]:

void WINAPI InitializeCriticalSection(
 __out  LPCRITICAL_SECTION lpCriticalSection
);

Опис мовою Delphi:

procedure InitializeCriticalSection(
  var lpCriticalSection: TRTLCriticalSection
);

Перед входом у код критичної секції потік має викликати функцію EnterCriticalSection. Її опис мовою C[3]:

void WINAPI EnterCriticalSection(
 __inout  LPCRITICAL_SECTION lpCriticalSection
);

Якщо в цей момент жоден з потоків процесу не володіє критичною секцією, то вона стає власником її об'єкта і продовжує виконання. Якщо секція вже захоплена іншим потоком, викликаючий потік зупиняється до її звільнення. Потік, який володіє критичною секцією, може повторно викликати EnterCriticalSection без блокування свого виконання.

Відразу після закінчення роботи зі спільним ресурсом потік повинен звільнити об'єкт критичної секції викликом процедури LeaveCriticalSection. Її опис мовою C[4]:

void WINAPI LeaveCriticalSection(
 __inout  LPCRITICAL_SECTION lpCriticalSection
);

Опис мовою Delphi:

procedure LeaveCriticalSection(
  var lpCriticalSection: TRTLCriticalSection
);

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

Для кожної критичної секції система підтримує лічильник входжень, тому потік повинна звільнити її стільки разів, скільки захоплювала. Недотримання цієї умови приведе до блокування потоку ("зависання").

Слід також пам'ятати, що спроба виходу з критичної секції, якою потік не володіє, також приведе до блокування викликаючого потоку.

Програма може здійснити спробу захоплення об'єкта критичної секції без зупинки потоку. Для цього використовують функцію TryEnterCriticalSection (опис мовою C[5]):

BOOL WINAPI TryEnterCriticalSection(
 __inout  LPCRITICAL_SECTION lpCriticalSection
);

Опис функції на Delphi:

function TryEnterCriticalSection(
  var lpCriticalSection: TRTLCriticalSection
): BOOL;

У момент виклику вона перевіряє, чи критична секція захоплена якимось іншим потоком. Якщо так — функція повертає false, у протилежному випадку вона захоплює критичну секцію та повертає true.

Після завершення роботи з критичною секцією вона повинна бути вивільнена викликом процедури DeleteCriticalSection. Опис на C[6]:

void WINAPI DeleteCriticalSection(
 __inout  LPCRITICAL_SECTION lpCriticalSection
);

Опис на Delphi:

procedure DeleteCriticalSection(
  var lpCriticalSection: TRTLCriticalSection
);

Приклад використання критичної секції

Нижче приведено фрагмент коду (мовою Delphi[1]), який забезпечує синхронізацію роботи потоку при звертанні до спільної (для кількох потоків) змінної A. Задля усунення неоднозначності, викликаної конкуренцією потоків, подібний фрагмент програми повинен бути у всіх потоках, які працюють зі змінною A. Якщо подібної синхронізації не використовувати, то виникатиме конкуренція потоків.

// Оголошення критичної секції
var ICriSec : TRTLCriticalSection;
...................................
// Ініціалізація - до запуску першого потоку
InitializeCriticalSection(ICriSec);
...................................
// Функція потоку
function ThreadFunc(Ptr: Pointer): LongInt;
var I : integer;
begin
 for I := 1 to 1000000 do begin
   // Якийсь код
   EnterCriticalSection(ICriSec);
   Inc(A);
   LeaveCriticalSection(ICriSec);
   // Якийсь код
 end;
end;
....................................
// Знищення об'єкта критичної секції
DeleteCriticalSection(ICriSec);

Примітки

  1. а б Коноваленко І.В., Федорів П.С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012 [Архівовано 8 грудня 2012 у Wayback Machine.].
  2. MSDN: InitializeCriticalSection function. Архів оригіналу за 20 квітня 2012. Процитовано 29 квітня 2012.
  3. MSDN: EnterCriticalSection function. Архів оригіналу за 18 квітня 2012. Процитовано 29 квітня 2012.
  4. MSDN: LeaveCriticalSection function. Архів оригіналу за 30 січня 2012. Процитовано 29 квітня 2012.
  5. MSDN: TryEnterCriticalSection function. Архів оригіналу за 20 квітня 2012. Процитовано 29 квітня 2012.
  6. MSDN: DeleteCriticalSection function. Архів оригіналу за 22 квітня 2012. Процитовано 29 квітня 2012.

Див. також



Read other articles:

Yang TerhormatAlbert Ho Chun-yan何俊仁 Ketua Aliansi Hong Kong dalam Dukungan Gerakan Demokratik Patriotik di TiongkokPetahanaMulai menjabat 15 Desember 2014WakilRichard TsoiMak Hoi-wah PendahuluLee Cheuk-yanPenggantiPetahanaAnggota Dewan LegislatifPetahanaMulai menjabat 1 Oktober 2012 PendahuluKonstituensi baruPenggantiPetahanaDaerah pemilihanDewan Distrik (Kedua)Masa jabatan1 Juli 1998 – 30 September 2012 PendahuluParlemen baruPenggantiKwok Ka-kiDaerah pemilihanWilayah...

 

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Desember 2023. Tobias Weis Informasi pribadiTanggal lahir 30 Juli 1985 (umur 38)Tempat lahir Schwäbisch Hall, Jerman BaratTinggi 1,70 m (5 ft 7 in)Posisi bermain GelandangInformasi klubKlub saat ini VfL Bochum(pinjaman dari TSG 1899 Hoffenheim)N...

 

For the Lutheran church in Jerusalem, see Church of the Redeemer, Jerusalem.Lutheran church in Atlanta, Georgia Church in Atlanta, GeorgiaLutheran Church of the RedeemerEvangelical Lutheran Church of the RedeemerThe church as seen in 2019Lutheran Church of the RedeemerShow map of Atlanta MidtownLutheran Church of the RedeemerShow map of AtlantaLutheran Church of the RedeemerShow map of GeorgiaLutheran Church of the RedeemerShow map of the United States33°46′28″N 84°23′03″W /...

Election for the governorship of the U.S. state of Minnesota See also: 2018 United States gubernatorial elections 2018 Minnesota gubernatorial election ← 2014 November 6, 2018 2022 →   Nominee Tim Walz Jeff Johnson Party Democratic (DFL) Republican Running mate Peggy Flanagan Donna Bergstrom Popular vote 1,393,096 1,097,705 Percentage 53.8% 42.4% County results Congressional district results Precinct resultsWalz:      40–50% ...

 

First South Korean lunar orbiter This article is about the South Korean lunar space probe. For the Indonesian police officer, see Bambang Hendarso Danuri. Korea Pathfinder Lunar Orbiter (KPLO)A rendered image of KPLONamesKPLOMission typeLunar orbiterOperatorKorea Aerospace Research Institute (KARI)COSPAR ID2022-094A SATCAT no.53365Websitewww.kari.re.kr/eng/sub03_07_01.doMission duration633 days, 3 hours and 32 minutes (elapsed) Spacecraft propertiesManufacturerKorea Aerospace R...

 

Festive day set aside by custom or by law This article is about days of observance. For a leave of absence or a trip, see Vacation. For leave from employment, see Annual leave. For the holidays, see Christmas and holiday season. For other uses, see Holiday (disambiguation) and Observance (disambiguation). Graphic showing the symbols and types (religion/secularism) of varying holidays. A holiday is a day or other period of time set aside for festivals or recreation. Public holidays are set by ...

Questa voce o sezione sull'argomento attori britannici non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Segui i suggerimenti del progetto di riferimento. Frances Fisher nel 2014 Frances Louise Fisher (Milford-on-Sea, 11 maggio 1952) è un'attrice statunitense. Indice 1 Biografia 1.1 Vita privata 2 Filmografia 2.1 Cinema 2.2 Televisione 3 Doppiatrici itali...

 

Ираклеониты — ученики гностика Ираклеона (II век). Упоминаются как особая секта Епифанием и Августином; при крещении и миропомазании они соблюдали обряд помазания елеем и при этом произносили воззвания на арамейском языке, которые должны были освободить душу от власт�...

 

المسمار الذهبي (القرص البرونزي في الجزء السفلي من الصورة) أو نوع المقطع لنقطة ومقطع طبقة الحدود العالمية (GSSP) الخاصة لقاعدة العصر الإدياكاري (إدياكارا، جنوب أستراليا) المسمار الذهبي تحدد علامة لنقطة ومقطع طبقة الحدود العالمية نقطة ومقطع طبقة الحدود العالمية (بالإنجليزية: G...

ПосёлокСовхоза «Труд» 50°09′04″ с. ш. 41°14′22″ в. д.HGЯO Страна  Россия Субъект Федерации Воронежская область Муниципальный район Петропавловский Сельское поселение Старокриушанское История и география Прежние названия отд. свх. им. Юркина[1] Часовой пояс UTC...

 

جهاز بولي الاسم العلميSystema urinarium 1. الجهاز البولي للإنسان: 2. الكلية, 3. حوض الكلية, 4. حالب, 5. مثانة بولية, 6. إحليل. (الجانب الأيسر في مستوى إكليلي)7. غدة كظريةالأوعية: 8. شريان كلوي ووريد كلوي 9. وريد أجوف سفلي, 10. أبهر بطني, 11. شريان وركي أصلي ووريد وركي أصليمع شفافية: 12. الكبد, 13. الأم...

 

Subprefecture of Tokyo This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Hachijō Subprefecture – news · newspapers · books · scholar · JSTOR (May 2019) (Learn how and when to remove this message) Place in Tokyo MetropolisHachijō Subprefecture 八丈支庁Hachijō-shichōLocation of Hachijō Subprefecture in ...

اقتصاد توغوتعدين الفوسفات في توغوعامالدولة توغوعملة فرنك غرب أفريقيالمنظمات الاتحاد الأفريقي، منطقة التجارة الحرة للقارة الإفريقية، البنك الإفريقي للتنمية، المجموعة الاقتصادية لدول غرب إفريقيا، البنك الدولي، صندوق النقد الدولي، منظمة التجارة العالمية، مجموعة ال77الإ...

 

American journalist Denton G. BurdickOregon state legislator Denton Burdick, 192231st Speaker of the Oregon House of RepresentativesIn office1925–1926Preceded byKaspar K. KubliSucceeded byJohn H. CarkinMember of the Oregon House of Representativesfrom the 21st districtIn office1917–1930Preceded byWesley O. SmithSucceeded byPerry O. DeLap Personal detailsBorn(1891-03-25)March 25, 1891Sault Ste. Marie, Michigan, United StatesDiedSeptember 1, 1970(1970-09-01) (aged 79)Portla...

 

Pour l’article homonyme, voir Rockies du Colorado. Rockies du Colorado Données-clés Fondation 1976 Disparition 1982 Siège Denver (Colorado, États-Unis) Patinoire (aréna) McNichols Sports Arena16 061 places Couleurs Rouge, blanc, bleu et doré Ligue Ligue nationale de hockey Association Clarence Campbell Division Smythe modifier Les Rockies du Colorado sont une franchise de hockey sur glace d'Amérique du Nord. L'équipe évolue dans la Ligue nationale de hockey entre 1976 et...

Void between celestial bodies This article is about the space between celestial bodies. For the general concept, see Space. For other uses, see Outer space (disambiguation). Being essentially empty, outer space allows the earliest (redder) galaxies to be viewed without obstruction, as in the Webb's First Deep Field image. Outer space (or simply space) is the expanse that exists beyond Earth's atmosphere and between celestial bodies.[1] It contains ultra-low levels of particle densitie...

 

Dieser Artikel beschreibt die Bundesstraße 75 in Deutschland. Zur gleichnamigen Straße in Österreich siehe Glattjoch Straße. Vorlage:Infobox hochrangige Straße/Wartung/DE-B Bundesstraße 75 in Deutschland Karte Verlauf der B 75 Alle Koordinaten: OSM | WikiMap Basisdaten Betreiber: Deutschland Bundesrepublik Deutschland Weiterer Betreiber: Herrentunnel Lübeck GmbH & Co. KG Straßenbeginn: Delmenhorst(53° 1′ 50″ N, 8° 40′ 20″ ...

 

今永 昇太シカゴ・カブス #18 横浜DeNAベイスターズ時代(2023年7月15日、横浜スタジアムにて)基本情報国籍 日本出身地 福岡県北九州市八幡西区生年月日 (1993-09-01) 1993年9月1日(31歳)身長体重 5' 10 =約177.8 cm175 lb =約79.4 kg選手情報投球・打席 左投左打ポジション 投手プロ入り 2015年 ドラフト1位初出場 NPB / 2016年3月29日MLB / 2024年4月1日年俸 $9,250,000(2024年)[1]�...

1990 Manipuri film Ishanou (The Chosen One)Official posterDirected byAribam Syam SharmaWritten byM. K. Binodini DeviProduced byAribam Syam SharmaStarringAnoubam KiranmalaKangabam TombaCinematographyGirish PadhiarEdited byUjjal NandyMusic byAribam Syam SharmaProductioncompanyAribam Syam Sharma ProductionsDistributed byDoordarshan Kendra GuwahatiRelease date 6 July 1990 (1990-07-06) Running time90 minutesCountryIndiaLanguageMeitei language (officially called Manipuri language) Is...

 

  هذه المقالة عن النزاع ما بين الإسرائيليين والفلسطينيين. لمعانٍ أخرى، طالع الصراع العربي الإسرائيلي. الصراع الفلسطيني الإسرائيلي جزء من الصراع العربي الإسرائيلي خريطة لفلسطين التاريخية معلومات عامة التاريخ 1897 – الآن(127 سنة) البلد إسرائيل دولة فلسطين  الموقع فلسط...