30515

Средства синхронизации потоков в ОС Windows. Функции и объекты ожидания. Критические секции

Доклад

Математика и математический анализ

При создании многопоточных приложений необходимо контролировать взаимодействие отдельных потоков. Большинство ошибок при работе с потоками возникает из-за того, что во время работы приложения различные потоки пытаются обратиться к одним и тем же данным. Для предотвращения подобной ситуации в ОС Windows (как впрочем и в других операционных системах) существуют средства синхронизации, которые позволяют контролировать доступ к разделяемым ресурсам.

Русский

2013-08-24

25.71 KB

14 чел.

Средства синхронизации потоков в ОС Windows. Функции и объекты ожидания. Критические секции.

НА ДОСКЕ:

1) single-object

DWORD WaitForSingleObject (

 HANDLE hHandle,

 DWORD dwMilliseconds

);

2) multiple-object

DWORD WaitForMultipleObjects(

 DWORD nCount,

 const HANDLE* lpHandles,

 BOOL bWaitAll,

 DWORD dwMilliseconds

);

3) сигнализирующие (alertable).

На доске особо рисовать нечего. Можем схематично показать занятость и свободность объекта ядра. Либо предоставить на обозрение публике куски кода.

В основную часть терминология с кратким объяснением.

В дополнительную часть подробное объяснение любой функции с демонстрацией кусков кода реализации.

ВЫСТУПЛЕНИЕ:

При создании многопоточных приложений необходимо контролировать взаимодействие отдельных потоков. Большинство ошибок при работе с потоками возникает из-за того, что во время работы приложения различные потоки пытаются обратиться к одним и тем же данным. Для предотвращения подобной ситуации в ОС Windows (как впрочем и в других операционных системах) существуют средства синхронизации, которые позволяют контролировать доступ к разделяемым ресурсам.

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

В Windows существует три группы wait-функций:

1) single-object

К этой группе относится функция WaitForSingleObject(), которая приостанавливает поток до освобождения заданного объекта синхронизации.

DWORD WaitForSingleObject(

 HANDLE hHandle,

 DWORD dwMilliseconds

);

Параметр hHandle - это дескриптор объекта синхронизации.

Параметр dwMilliseconds указывает время, по истечении которого функция завершается, даже если объект синхронизации не освободился. В этом случае функция возвращает значение WAIT_TIMEOUT.

2) multiple-object

Функции этой группы позволяют потоку ждать освобождения или нескольких объектов синхронизации, или одного из них. К этой группе относится функция WaitForMultipleObjects().

DWORD WaitForMultipleObjects(

 DWORD nCount,

 const HANDLE* lpHandles,

 BOOL bWaitAll,

 DWORD dwMilliseconds 

);

Параметр nCount указывает количество дескрипторов объектов, содержащихся в массиве, на который указывает параметр lpHandles. Максимально возможное число дескрипторов объектов равно константе MAXIMUM_WAIT_OBJECTS.

Параметр lpHandles - указатель на массив, в котором содержаться дескрипторы объектов синхронизации.

Параметр bWaitAll - если этот параметр равен TRUE, то функция возвращает управление потоку, когда освобождаются все объекты синхронизации, дескрипторы которых содержатся в массиве. Если параметр равен FALSE, то функция завершается при освобождении любого из объектов.

Параметр dwMilliseconds указывает время, по истечении которого функция завершается, даже если объект синхронизации не освободился. В этом случае функция возвращает значение WAIT_TIMEOUT.

3) сигнализирующие (alertable).

При вызове любой wait-функции можно задавать время ожидания, по истечении которого функция завершается, не дождавшись выполнения заданного условия, и возвращает потоку значение WAIT_TIMEOUT.

Объекты синхронизации:

  1.  Семафор (Semaphore)
  2.  Мьютекс (Mutex)
  3.  Событие (Event)
  4.  Таймер (Timer)
  5.  Критическая секция (Critical Section)

Критические секции

Критическая секция — часть программы, в которой есть обращение к совместно используемым данным. При нахождении в критической секции двух (или более) процессов, возникает состояние «гонки» («состязания»). Для избежания данной ситуации необходимо выполнение четырех условий:

  1.  Два процесса не должны одновременно находиться в критических областях.
  2.  В программе не должно быть предположений о скорости или количестве процессоров.
  3.  Процесс, находящийся вне критической области, не может блокировать другие процессы.
  4.  Невозможна ситуация, в которой процесс вечно ждет попадания в критическую область.

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

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

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

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

Критические секции Windows имеют оптимизацию, заключающуюся в использовании атомарно изменяемой переменной наряду с объектом «событие синхронизации» ядра. Захват критической секции означает атомарное увеличение переменной на 1. Переход к ожиданию на событии ядра осуществляется только в случае, если значение переменной до захвата было уже больше 1, то есть происходит реальное «соревнование» двух или более потоков за ресурс.

Таким образом, при отсутствии соревнования захват/освобождение критической секции обходятся без обращений к ядру.

Кроме того, захват уже занятой критической секции до обращения к ядру какое-то небольшое время ждёт в цикле опроса переменной, и, если переменная становится равной 0, то захват происходит без обращений к ядру.

Сходный объект в ядре Windows называется FAST_MUTEX (ExAcquire/ReleaseFastMutex). Он отличается от критической секции отсутствием поддержки рекурсивного повторного захвата тем же потоком.

Аналогичный объект в Linux называется фьютекс.

Функции ожидания

Объекты синхронизации используются совместно с функциями ожидания. Эти функции связываются с одним или несколькими синхронизирующими объектами и ждут, когда эти объекты перейдут в сигнальное состояние. Тем самым выполнение процесса может быть приостановлено до тех пор, пока в системе не произойдёт некоторое событие.

Ожидание одного события может быть организовано вызовом функции WaitForSingleObject:

DWORD WaitForSingleObject(

 IN HANDLE hHandle,

 IN DWORD dwMilliseconds

);

Параметр hHandle - дескриптор объекта синхронизации.

Параметр dwMilliseconds - время ожидания (тайм-аут) в миллисекундах.

  1.  Если объект, на который указывает hHandle, в данный момент находится в несигнальном состоянии, функция ждёт, пока он перейдёт в сигнальное состояние, или пока не закончится время ожидания.
  2.  Если объект в момент вызова функции находится в сигнальном состоянии, функция возвращается немедленно.
  3.  Если возвращённое функцией значение равно WAIT_TIMEOUT, это свидетельствует о том, что время ожидания истекло, а объект так и не перешёл в сигнальное состояние. Значение WAIT_OBJECT_0 свидетельствует о том, что объект сразу был в сигнальном состоянии или перешёл в это состояние во время ожидания. Возвращённое функцией WaitForSingleObject значение WAIT_ABANDONED возможно только для мьютексов и свидетельствует о том, что мьютекс освободился вследствие окончания выполнения владевшего им потока. Подробнее это будет рассмотрено в статье "Мьютексы". Значение WAIT_FAILED свидетельствует об ошибке выполнения функции.
  4.  Если параметр dwMilliseconds задан равным 0, функция тестирует состояние объекта и немедленно возвращается, независимо от состояния объекта.
  5.  Если dwMilliseconds = INFINITE, функция возвращается только при переходе объекта в сигнальное состояние. Такое значение параметра dwMilliseconds надо задавать с большой осторожностью при этом надо быть абсолютно уверенным, что рано или поздно объект перейдёт в сигнальное сотояние. В противном случае приложение "зависнет".

Перед возвращением функция WaitForSingleObject изменяет состояние объекта, например, захватывает мьютекс, уменьшает число семафора на 1 и т.д.

Ожидание нескольких синхронизирующих объектов может быть организовано функцией WaitForMultipleObjects:

DWORD WaitForMultipleObjects (

IN DWORD nCount,                             

IN CONST HANDLE *lpHandles,

                            IN BOOL bWaitAll,

                            IN DWORD dwMilliseconds

);

Параметр lpHandles является указателем на массив дескрипторов объектов синхронизации.

Параметр nCount определяет число дескрипторов в этом массиве, используемых функцией.

Параметр bWaitAll определяет логику ожидания.

  1.  При bWaitAll = true функция ждёт, пока все объекты окажутся в сигнальном состоянии.
  2.  При bWaitAll = false функция возвращается, если в сигнальном состоянии находится хотя бы один объект. В этом случае возвращаемое функцией значение указывает, какой именно объект находится в этом состоянии.

Параметр dwMilliseconds определяет время ожидания и всё, сказанное выше об аналогичном параметре функции WaitForSingleObject, относится и к данной функции.

Функция работает аналогично функции WaitForSingleObject, отличаясь только возвращаемыми значениями.

  1.  При bWaitAll = true функция возвращает значения WAIT_OBJECT_0, WAIT_TIMEOUT, WAIT_ABANDONED_0 или WAIT_FAILED. Смысл этих значений рассматривался ранее.
  2.  При bWaitAll = false возможные значения WAIT_TIMEOUT, WAIT_FAILED, от WAIT_OBJECT_0 до WAIT_OBJECT_0 + nCount – 1 и от WAIT_ABANDONED_0 до WAIT_ABANDONED_0 + nCount - 1. Разности возвращённого результата - WAIT_OBJECT_0 или возвращённого результата - WAIT_ABANDONED_0 дают индекс того объекта в массиве lpHandles, который вызвал завершение выполнения функции.

 

А также другие работы, которые могут Вас заинтересовать

40024. Имитационное моделирование инвестиционных рисков 138.5 KB
  В процессе предварительного анализа экспертами были выявлены три ключевых параметра проекта: объем выпуска Q цена за штуку – P переменные затраты – V. Прочие параметры: постоянные затраты при производстве F амортизация – налог на прибыль – T норма дисконта – R срок проекта – n начальные инвестиции I0 описывающие проект считаются постоянными величинами табл. Ключевые параметры проекта по производству продукта А Показатели Сценарий минимум максимум Объем выпуска Q 150 300 Цена за штуку P 40 55 Переменные затраты V 25 35...
40025. ИНФОРМАЦИОННЫЕ СИСТЕМЫ В ЭКОНОМИКЕ 1.13 MB
  Crmсистемы 5. На микропроцессорах и интегральных схемах создаются компьютеры компьютерные сети системы передачи данных. На этом в частности основаны многие современные системы шифрования данных и механизмы электронной подписи.
40026. Доходность вексельной сделки 2.11 MB
  Пример создания проекта Цель проекта: разработать компьютерную программу состоящую из двух модулей. Создание проекта и установка параметров Будем считать что аналогов создаваемому проекту в мире нет и мы начинаем его строить с нуля. Убедиться что параметры проекта установленные по умолчанию и представленные в окне Сведения о проекте нас устраивают; если это действительно так щелкнуть на кнопке Отменить чтобы закрыть окно без изменений; в противном случае после внесения изменений требуется щелкнуть на кнопке ОК. Для однообразия...
40027. Создание локальных и открытых баз данных 11.29 MB
  ПЕРМЬ 2006 Введение Для выполнения практических заданий студент должен: иметь представление о принципах построения баз данных этапах создания и возможностях эксплуатации; знать основные свойства системы управления реляционными базами данных MS ccess; уметь использовать реляционные базы данных в локальных и глобальных сетях. Разработка базы данных разбивается на следующие основные этапы: 1. Определение цели создания базы данных На первом этапе разработки базы данных необходимо определить ее назначение и как она будет использоваться.
40028. База Данных «Прием в поликлинику» 3.31 MB
  Она содержит: Данные о каждой приеме: дата приема время приема специалист пациент предварительный диагноз лечение; Данные о специалистах: ФИО специализация стаж работы № договора № кабинета; Данные о пациенте: ФИО дата рождения пол адрес номер мед.[№_кабинета] FROM Специалист ORDER BY [Фамилия_И_О_специалиста]; RowSourceType: Таблица или запрос SourceField: Специалист SourceTble: Прием Пациент Текстовый 5 RowSource: SELECT [Пациент].[Код_пациента] [Пациент].
40029. База данных «Склад сотовых телефонов» 802.5 KB
  21 Назначение базы данных Склад сотовых телефонов База данных Склад предназначена: для клиента покупателя для работника склада Созданная база данных содержит информацию о: фирме производителя адрес контактный телефон контактное лицо индекс; товаре телефонах; клиентах ФИО код клиента телефон адрес; заказах код заказа дата и оплата заказа количество заказанных телефонов С помощью этой базы данных клиент может посмотреть параметры и свойства понравившегося ему телефона.ФИО_клиента FROM Клиент ORDER BY...
40030. Метрологічний аналіз ІВК «установки каталітичного крекінгу» (автоматизація реакторного блоку) на базі ентропійного коефійієнта 2.2 MB
  Сучасні ІВК визначаються як автоматизовані засоби вимірювань та обробки інформації, призначених для контролю складних обєктів у вигляді сукупності програмно-керованих технічних засобів (вимірювальних, обчислювальних, допоміжних), та мають блочно-модульну
40031. Иностранный гражданин как субъект трудового права 131.5 KB
  В реферате рассмотрены лишь основные противоречия и пробелы трудового законодательства в отношении иностранных граждан. Имеются они и по вопросам предоставления гарантий и компенсаций иностранному работнику, регулирования надомной работы
40032. База данных «Сеть кинотеатров» 784.91 KB
  Назначение. База данных «Сеть кинотеатров» предназначена как для работников справочной службы кинотеатров города так и для обычных пользователей. БД обеспечивает в режиме диалога доступ к информации об имеющихся городе кинотеатров и фильмах, которые в них идут. Предусмотрена возможность как внесения изменений, так и получения справок с выводом информации на печать.