Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Объект CRITICAL_SECTION



Критическая секция — это часть кода, которая одновременно может выполняться только одним потоком; выполнение такой секции одновременно более чем одним потоком может привести к непредсказуемым и неверным результатам.

В качестве простого механизма для реализации идеи критической секции Win32 предоставляет объект CRITICAL_SECTION.

Объекты типа CRITICAL_SECTTON (критическая секция — КС) могут быть инициали­зированы и удалены, но они не имеют дескрипторов и не разделяются другими процесса­ми. Переменная должна быть определена как имеющая тип CRITICAL_SECTION. Потоки входят в КС и покидают ее, но одновременно в КС может находиться только один поток. Однако поток может входить в КС и покидать ее в нескольких местах программы.

Для инициализации и удаления переменной типа CRITICAL_SECTION используйте следующие функции:

VOIDInitializeCriticalSection (LPCRITICAL_SECTIONlpcsCritical Section)

VOIDDeleteCriticalSection (LPCRITICAL_SECTION lpcsCriticalSection)

Функция EnterCriticalSection блокирует поток, если в данной секции находится другой поток. С ожидающего потока снимается блокировка, когда другой поток выполняет функцию LeaveCritcicalSection. Мы говорим, что поток "владеет" КС с того момента, когда он получает управление от функции EnterCriticalSection, по тот момент, как функция LeaveCriticalSection отдает владение КС. Всегда отда­вайте владение КС; если этого не сделать, другие потоки вынуждены будут ожидать вечно, даже если владеющий поток будет завершен.

Мы часто будем говорить, что КС "блокирована" или "разблокирована", а вхож­дение в КС — то же самое, что и ее блокировка.

VOID EnterCriticalSection(LPCRITICAL_SECTION lpcsCriticalSecticn)

VOID LeaveCriticalSection (LPCRITICAL _ SECTION lpcsCriticalSecticn)

Если поток уже владеет КС, он может войти в нее снова без блокировки. Поддерживается счетчик, поэтому поток должен покинуть КС столько же раз, сколько он вошел в нее, чтобы освободить КС для других потоков.

Выход из КС, которой данный поток не владеет, может привести к непредсказуе­мым результатам, включая блокировку потока.

Для функции EnterCriticalSection время ожидания не ограничивается, поток будет заблокирован до того момента, когда поток, владеющий КС, выйдет из нее. Можно провести проверку или опрос, чтобы узнать, владеет ли КС какой-нибудь другой поток, используя функцию TryEnterCriticalSection.

BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpcsCriticalSection)

Возвращенное значение TRUE показывает, что вызвавший функцию поток теперь владеет КС, а значение FALSE показывает, что КС уже занята другим потоком.

Объекты CRITICAL_SECTION имеют преимущество в том, что не являются объек­тами ядра и располагаются в пользовательском пространстве.





Дата публикования: 2015-11-01; Прочитано: 438 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.005 с)...