Страница с допълнителни механизми за синхронизация
Сайт на Delphi: ежедневни Delphi-новини, документация, статии, преглед, интервю, компютърен хумор.
Критичните секции са механизъм за синхронизиране на нишки в рамките на един процес. Подобно на mutex, критична секция може да бъде собственост само на една нишка в даден момент, но това е по-бърз и по-ефективен механизъм от mutex-ите. Преди да използвате критична секция, трябва да я инициализирате с функцията InitializeCriticalSection:
процедура Ini t i a1 i zeC i t i ca1 Раздел i on(
След създаването на обекта нишката трябва да извика функцията EnterCriti cal Section, преди да получи достъп до защитения ресурс:
Ако в този момент никоя нишка в процеса не притежава обекта, тогава нишката става собственик на критичната секция и продължава изпълнението. Ако секцията вече е уловена от друга нишка, тогава изпълнението на нишката, която е извикала функцията, се спира, докато не бъде освободена.
Нишката, която притежава критичната секция, може многократно да извиква функцията EnterCrltic 1 Section on, без да блокира нейното изпълнение. Когато приключи с ресурса, който трябва да бъде защитен, нишката трябва да извика функцията LeaveCriticalSection:
Тази функция освобождава обекта, независимо от това колко пъти нишката преди това е извикала функцията EnterCriti cal Section. Ако има други нишки, чакащи секцията да бъде освободена, една от тях става неин собственик и продължава изпълнението. Ако нишката приключи, без да освободи критичната секция, нейното състояние става недефинирано, което може да доведе до блокиране на програмата.
Можете да опитате да заснемете обекта, без да замразявате потока. Това се прави с помощта на функцията TryEnterCriticalSection:
функция TryEnterCri ti ca1SectiНа(
Тази функция проверява дали разделът е уловен в момента на извикването му. Ако да, функцията връща False, в противен случай тя улавя секцията и връща True.
След приключване на работата с критичен раздел, той трябва да бъде унищожен чрез извикване на функцията Del eteCri ti cal Secti on:
Помислете за пример на приложение, което зарежда данни по мрежата в няколко нишки. Глобалните променливи BytesSummary и TimeSummary съхраняват общия брой изтеглени байтове и времето за изтегляне. Тези променливи се актуализират от всяка нишка, докато данните се четат. За да предотврати конфликти, приложението трябва да защити споделения ресурс с критичен раздел.
var // Глобални променливи Cri ti cal Secti on : TRTLCri ti cal Secti on ; BytesSummary: кардинал; TimeSummary: TDateTime; Средна скорост: плаваща.
// При инициализиране на приложението
// В метода Execute на потока, зареждащ данните. повторете