Загрузка...
 
Печать

Потоки. Критические секции (Critical sections)


Так как все современные ОС семейства MS Windows являются многозадачными (multitasking), рано или поздно Windows-приложения начинают сбоить при обращении к общим ресурсам, особенно те, которые используют несколько потоков. Представь ситуацию, когда один поток заполняет структуру какими-либо очень важными данными, а другой вдруг пытается получить доступ к ним или даже пытается их изменить.

Существует способ, позволяющий быть уверенным, что только один выбранный поток имеет полный контроль над данными. Именно для этого был придуман механизм критических секций (областей) (critical sections). При активации критическая секция блокирует попытки всех остальных потоков получить доступ к разделяемой памяти (shared memory; общая память, которую используют все потоки). Это позволяет каждому отдельному потоку индивидуально получать доступ или изменять данные приложения, не опасаясь, что другие потоки смогут вмешаться в данный процесс.

Для использования критической секции её сперва необходимо объявить и инициализировать:
Инициализация критической секции
CRITICAL_SECTION CriticalSection;
InitializeCriticalSection(&CriticalSection);

Сразу после этого можно войти в критическую секцию, обработать данные и выйти из неё, как это представлено ниже:
Вход в критическую секцию и выход из неё
EnterCriticalSection(&CriticalSection);

// Обрабатываем важные данные здесь

LeaveCriticalSection(&CriticalSection);


По окончании работы с критической секцией (например при выходе из приложения), освобождваем её:
Вход в критическую секцию и выход из неё
DeleteCriticalSection(&CriticalSection);


Применять критические секции совсем не трудно, но, в то же время, крайне необходимо при создании многопоточных приложений. Главное правило здесь код, расположенный в области критической секции, должен выполняться как можно быстрее. В противном случае ты рискуешь подвесить системные процессы ОС, что может привести к её "падению".

===

ИСТОЧНИКИ:

  1. Adams J. "Programming Role Playing Games with DirectX, 2nd Ed.", 2004. Premier Press

Contributors to this page: slymentat .
Последнее изменение страницы Вторник 29 / Ноябрь, 2016 11:38:54 MSK автор slymentat.

Помочь проекту

Яндекс-деньги: 410011791055108