Критичні секції · OpenMP
У чергу, сучі діти, у чергу!
М. А. Булгаков "Собаче серце"
За допомогою директивиcritical ми можемо вказати ділянку коду, яка буде виконуватися лише одним потоком одночасно. Якщо один із потоків почав виконання критичної секції з цим ім'ям, то інші потоки, що почали виконання цієї ж секції, будуть заблоковані. Вони чекатимуть на свою чергу. Як тільки перший потік завершить виконання секції, один із заблокованих потоків увійде до неї. Вибір наступного потоку, який виконуватиме критичну секцію, буде випадковим.
Критичні секції можуть бути іменованими чи не іменованими. У різних ситуаціях покращує продуктивність. Відповідно до стандарту всі критичні секції без імені будуть асоційовані одним ім'ям. Привласнення імені дозволить вам одночасно виконувати дві і більше критичні секції одночасно.
Дуже важливо щоб ім'я критичної секції не було назвою системної функції або було ідентично вже використаному в проекті.
Існують випадки коли називати потрібно одним ім'ям. Коли у вас в обох критичних секціях виведення в той самий файл або виведення на екран.
Обробка вкладених критичних секцій може створити умову для настання взаємного блокування.
Критичні секції є зручним інструментом для розмежування доступу до загальних даних. Однак критична секція привносить у паралельну програму послідовний код, що знижує ефективність. Слід застосовувати лише за потребою. Нижче наведено приклад модифікації коду з критичною секцією.
Змінений код буде більш продуктивним.
Використання critical коли ефективніше використовувати atomic
Великі обсяги робіт усередині critical секції