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

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

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

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

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

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

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

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

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

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

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

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

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


dopolnitelnoe-obrazovanie-vzroslih.html
dopolnitelnoe-professionalnoe-obrazovanie-doklad-podgotovlen-na-osnove-monitoringovih-issledovanij-dannih-sociologicheskih.html
dopolnitelnoe-soglashenie-.html