Дополнительные рекомендации относительно использования мьютексов и объектов CRITICAL_SECTION

Дополнительные рекомендации относительно использования мьютексов и объектов CRITICAL_SECTION

К этому времени мы успели познакомиться со всеми объектами синхронизации Windows и исследовали их применимость на ряде примеров. Мьютексы и объекты CS рассматривались первыми, а поскольку события мы еще будем интенсивно использовать в следующей главе, то настоящую главу целесообразно завершить рекомендациями относительно применения мьютексов и объектов CS для обеспечения корректности выполнения, удобства сопровождения и повышения производительности программ.

Приведенные ниже утверждения сформулированы, как правило, в терминах мьютексов, однако, если не оговорено иное, все сказанное относится и к объектам CS.

• Если функция WaitForSingleObject, одним из аргументов которой является дескриптор мьютекса, вызывается без использования конечного интервала ожидания, то вызывающий поток может оказаться блокированным на неопределенное время. Ответственность за то, чтобы захваченный (блокированный) мьютекс в конечном счете был освобожден (разблокирован), возлагается на программиста.

• Если поток завершает выполнение или его выполнение прерывается до того, как он покинет (разблокирует) объект CS, то этот объект остается блокированным. Чрезвычайно полезным свойством мьютексов является то, что владеющий ими поток может завершить выполнение, не уступив прав владения мьютексом.

• Не пытайтесь получить доступ к ресурсам, защищаемым мьютексом, если функция WaitForSingleObject вызвана с использованием конечного интервала ожидания.

• Ожидать перехода блокированного мьютекса в сигнальное состояние могут сразу несколько потоков. Когда мьютекс освобождается, то только один из ожидающих потоков получает права владения мьютексом и переводится в состояние готовности планировщиком ОС на основании действующей стратегии приоритетов и планирования. Не следует делать никаких предположений относительно того, что какой-либо поток будет пользоваться приоритетом; как и в любом другом случае, программу следует проектировать таким образом, чтобы приложение работало корректно независимо от того, какой именно из ожидающих потоков получит права владения мьютексом и возобновит выполнение. Те же замечания остаются справедливыми и в отношении потоков, ожидающих наступления события; никогда не следует предполагать, что при переходе объекта события в сигнальное состояние освободится какой-то определенный поток или что потоки будут разблокированы в какой-то определенной очередности.  

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

• Определяемая мьютексами степень детализации программы, или гранулярность мьютексов (mutex granularity), оказывает влияние на производительность и требует серьезного рассмотрения. Размер каждого критического участка кода ни в коем случае не должен превышать необходимой величины, и мьютекс не должен захватываться на более длительный промежуток времени, чем это необходимо. Использование критических участков кода чрезмерно большого размера, захватываемых на длительные промежутки времени, снижает параллелизм и может оказывать отрицательное влияние на производительность.

• Связывайте мьютекс непосредственно с ресурсом, защиту которого он должен обеспечивать, возможно, с использованием структуры данных. (Именно эта методика задействована в программах 8.1 и 8.2.)

• Максимально точно документируйте инвариант, используя для этого словесные описания либо логические, или булевские, выражения. Инвариант— это свойство защищаемого ресурса, сохранение которого неизменным вне критического участка кода вы гарантируете. Форма выражения инвариантов может быть самой различной: "элемент принадлежит обоим спискам или не принадлежит ни одному из них", "контрольная сумма данных в буфере является достоверной", "связанный список является действительным" или "0 <= nLost + nCons <= sequence". Точно сформулированные инварианты могут использоваться совместно с макросом ASSERT при отладке программ, хотя оператор ASSERT должен иметь собственный критический участок кода.

• Убедитесь в том, что каждый критический участок кода имеет только одну точку входа, в которой поток блокирует мьютекс, и только одну точку выхода, в которой поток освобождает мьютекс. Избегайте использования сложных операторов ветвления и таких операторов, как break, return или goto, предоставляющих возможность выхода за пределы критического участка кода. Для защиты от подобных рисков оказываются удобными обработчики завершения.

• Если требуемая логика работы программы приводит к чрезмерному разрастанию критического участка кода (скажем, его размер превышает одну страницу), попробуйте разместить этот код в отдельной функции, чтобы можно было легко понять схему синхронизации. Так, целесообразно выделить в отдельную функцию код, предназначенный для удаления узла из сбалансированного дерева поиска, пока дерево остается блокированным. 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

4.7. Рекомендации по разработке диаграмм вариантов использования

Из книги Самоучитель UML автора Леоненков Александр

4.7. Рекомендации по разработке диаграмм вариантов использования Главное назначение диаграммы вариантов использования заключается в формализации функциональных требований к системе с помощью понятий соответствующего пакета и возможности согласования полученной


3. Заблуждение относительно производства

Из книги Волшебный котел автора Реймонд Эрик Стивен

3. Заблуждение относительно производства Мы должны начать с замечания о том, что компьютерные программы подобно всем другим видам инструментов или сре дств пр оизводства, имеют два отличных вида экономической ценности. Они имеют потребительскую стоимость и


Глава 2 Примеры использования  стандартных объектов WSH (JScript и VBScript)

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Глава 2 Примеры использования  стандартных объектов WSH (JScript и VBScript) В этой главе мы на примерах подробно рассмотрим, как с помощью стандартных объектов WSH 5.6, описание которых приведено в главе 1, можно решать некоторые практические задачи, связанные, в частности, с выводом


Предостережение относительно использования приоритетов потоков и процессов

Из книги Системное программирование в среде Windows автора Харт Джонсон М

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


Использование объектов CRITICAL_SECTION для защиты разделяемыхпеременных

Из книги MySQL: руководство профессионала автора Паутов Алексей В

Использование объектов CRITICAL_SECTION для защиты разделяемыхпеременных Использование объектов CRITICAL_SECTION не вызывает сложностей, и одним из наиболее распространенных способов их применения является обеспечение доступа потоков к разделяемым глобальным переменным.


Сравнительный обзор: мьютексы и объекты CRITICAL_SECTION

Из книги Первые шаги с Windows 7. Руководство для начинающих автора Колисниченко Денис Н.

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


Достоинства и недостатки объектов CRITICAL_SECTION

Из книги AutoCAD 2009. Учебный курс автора Соколова Татьяна Юрьевна

Достоинства и недостатки объектов CRITICAL_SECTION Прежде всего, мы попытаемся количественно оценить влияние объектов синхронизации на производительность, и сравним между собой объекты CRITICAL_SECTION и мьютексы. В программе statsMX.c (программа 9.1) для синхронизации доступа к


Совместное использование событий и мьютексов

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Совместное использование событий и мьютексов Далее показано, как обеспечить совместное использование мьютексов и событий путем обобщения программы 8.2, представляющей описанную ниже ситуацию, с которой нам еще не раз предстоит столкнуться. Примечание. Это обсуждение в


14.2.5. Некоторые рекомендации относительно DVD

Из книги автора

14.2.5. Некоторые рекомендации относительно DVD Одни разработчики DVD заявляют, что их диски могут хранить информацию до 50 лет, другие называют цифру в 100 лет. Я им не верю по одной простой причине: первый DVD появился в 1996 году, следовательно, самому «старому» DVD на момент


Зеркальное отображение относительно плоскости

Из книги автора

Зеркальное отображение относительно плоскости Команда MIRROR3D , осуществляющая зеркальное отображение объектов относительно заданной плоскости, вызывается из падающего меню Modify ? 3D Operations ? 3D Mirror.Запросы команды


1.4.4. Дополнительные примеры использования команды chmod

Из книги автора

1.4.4. Дополнительные примеры использования команды chmod Ниже приведен ряд Примеров, иллюстрирующих применение команды chmod в абсолютном режиме: Команда Строка режима Результат chmod 666 rw?rw?rw- Установка разрешений на чтение и запись для владельца, группы и других