Реферат: Синхронизация потоков
Потоки.Синхронизация потоковДля синхронизации действий, выполняемых разными потокамисуществует несколько различных способов. Условно их можно разделить наследующие:
· синхронизация с помощью глобальныхпеременных
· синхронизация с помощью обменасобытиями
· синхронизация с помощью специальныхобъектов (событий, семафоров, критических секций, объектов исключительноговладения и других)
Первый метод синхронизации следует признать самым неудачным,так как он требует постоянного опроса состояния глобальной переменной. У этогометода есть и более серьезные недостатки — так, например, возможна полнаяблокировка потоков, если поток, ожидающий изменения глобальной переменной имеетболее высокий приоритет, чем поток, изменяющий эту переменную. Правда, егоможно несколько улучшить — вводя дополнительные временные задержки междупоследовательными опросами.
Второй метод потребует создания объектов, способных получатьсообщения или извещения о выполнении некоторых действий. Это могут быть окна,файлы (например, при использовании асинхронных операций или операций суведомлением), каталоги и т.д. Во многих случаях может быть удобно создатьневидимое окно, участвующее в обмене сообщениями или ожидающее получениясообщений для выполнения тех или иных действий.
Третий метод — синхронизация с помощью специальных объектов —потребует рассмотрения разных объектов и разных методов синхронизации сиспользованием объектов. В Win32 API существует большое число объектов, которыемогут быть применены в качестве синхронизирующих, причем во многих случаяхвместо одного объекта может применяться объект другого типа. Поэтому будетинтересно рассмотреть несколько основных методов синхронизации с использованиемобъектов.
Общие представления о методахсинхронизацииПри рассмотрении способов синхронизации удобно выделитьнесколько основных способов, применяемых разными операционными системами. Вчисле таких способов можно выделить четыре метода:
· критические секции
· объекты исключительного владения
· события
· синхронизация группой объектов
Последовательно рассмотрим эти основные методы, используя вкачестве примера функции по работе с глобальной кучей. Попробуем абстрактноразобраться со свойствами этих функций, что бы понять, какие методысинхронизации и в каких случаях удобно применять.
Во–первых, глобальную кучу в целом можно рассматривать какнекий сложный объект, над которым могут выполняться некоторые операции (пока мырассматриваем только операции над кучей в целом, не вдаваясь в нюансы работы сотдельными блоками — при необходимости доступ к отдельным блокам кучи долженбыть синхронизирован, но это уже не функции кучи, а проблема того, ктопользуется кучей).
Часть операций, например получение указателя на какой–либоблок в куче, не нуждается в изменении самой кучи. То есть функции, осуществляющиеподобные операции могут выполняться одновременно разными потоками не конфликтуядруг с другом. Такие функции удобно назвать “читателями” — они не изменяют кучукак единый объект.
Другие операции, например выделение нового блока в куче,требуют внесения изменений в кучу — изменения в цепочке выделяемых блоков.Обычно такие изменения осуществляются не в одном месте, а требуетсясогласованное внесение изменений в нескольких структурах данных. В процессетакой операции структура кучи какое–то время оказывается нарушенной, вследствиечего одновременное выполнение таких действий должно быть исключено. Такиефункции удобно назвать “писателями” — они изменяют кучу как единый объект.
Применительно к куче возможен одновременный доступ несколькихчитателей и исключительный — писателей. Более того, если к куче получает доступписатель, то читатели также должны быть лишены доступа (в других случаях этоможет быть не так — читатели могут работать одновременно с писателем).
Можно сформулировать несколько правил для работы с такимобъектом:
· если к объекту имеет доступ писатель,то ни читатели, ни другие писатели доступа не имеют;
· если к объекту имеет доступ читатель,то возможен одновременный доступ других читателей и запрещен доступ писателям;
· если объект свободен, то первыйпришедший писатель или читатель имеет право доступа.
Рассмотренный пример очень удобен, так как подобная ситуация(много читателей, единственный писатель) встречается сплошь и рядом — астандартного объекта для синхронизации доступа к такому объекту нет. Благодаряэтому такой пример становится благодатной почвой для рассмотрения разныхспособов синхронизации.