Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Синхронизация с помощью критических секцийВ Windows, проблема взаимного исключения для параллельных потоков, выполняемых в контексте одного процесса, решается при помощи объекта типа Critical_Section, который не является объектом ядра ОС. Для работы с объектами этого типа, в Windows используется множество следующих функций: 1) InitializeCriticalSection (p); 2) EnterCriticalSection (p); 3) TryEnterCriticalSection (p); 4) LeaveCriticalSection (p); 5) DeleteCriticalSection (p). Каждая из этих функций имеет единственный параметр, представляющий собой указатель на объект типа Critical_Section. Все функции, за исключением третьей, не возвращают значений. Третья возвращает ненулевое значение, если поток вошел в критическую секцию, либо уже находится в ней. В противном случае возвращает ноль. Порядок использования. Предполагается, что при проектировании программы в одном из процессов в одном из его параллельных потоков выделяются критические секции, в которых используется ресурс, разделяемый этими потоками. В программе описывается объект типа Critical_Section и считается, что имя этого объекта логически связано с используемым разделяемым ресурсом. Перед тем как начать работу с указанным объектом, его инициализируют путем вызова InitializeCriticalSection. После инициализации объекта, в каждом из параллельных потоков перед входом в собственную критическую секцию потока вызывается функция 2. Она исключает одновременный вход в критические секции в параллельных потоках. После завершения работы с разделяемым ресурсом поток должен покинуть свою критическую секцию. Для подтверждения этого факта, после критической секции следует вызов LeaveCriticalSection. По окончании работы с CS все системные ресурсы, использованные этим объектом, освобождаются путем вызова DeleteCriticalSection. Объекты типа Critical_Section не являются объектами ядра ОС, поэтому работа с ними происходит быстрее, чем с объектами синхронизации, которые являются объектами ядра ОС. Это происходит потому, что обращение к объектам ядра требует дополнительных затрат процессорного времени для переключения контекстов потоков из пользовательского режима в защищенный режим работы ядра и обратно. Поэтому при разработке многопоточных приложений для решения задачи взаимного исключения между потоками одного и того же процесса, как правило, используются критические секции.
Дата добавления: 2014-10-10; просмотров: 301; Нарушение авторских прав Мы поможем в написании ваших работ! |