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, который вызвал завершение выполнения функции.

 

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

17192. Отношение к философии и богословию в святоотеческой традиции 42.51 KB
  Отношение к философии и богословию в святоотеческой традиции. Вопрос об отношении между философией и богословием между верой и разумом достаточно старый и решался он в зависимости от культурной и исторической ситуации поразному. Для нас важно что в полемике по этом
17193. ДОМАШНИЙ ДОКТОР ДЛЯ ДЕТЕЙ 2.06 MB
  Клафлин Эдвард под ред. ДОМАШНИЙ ДОКТОР ДЛЯ ДЕТЕЙ Советы американских врачей пер. Почиталин И. Г. Изд. КронПресс Москва 1997 г. OCR Палек Alligator 1998 г. Вступление Как помочь здоровью вашего ребенка Если у вас есть дети вы наверное захотите чтобы под рукой ...
17194. КРИЗИС БЕЗБОЖИЯ 68 KB
  И.Ильин КРИЗИС БЕЗБОЖИЯ Первая глава лекции прочитанной И.А. Ильиным в Риге 11 октября 1935 года. Историческое время выпавшее нам на долю исполнено великого и глубокого значения: это эпоха чрезвычайной насыщенности напряженности эпоха крушения подводящего...
17195. ПРЕДАНИЕ И ПРЕДАНИЯ 66.5 KB
  Лосский ПРЕДАНИЕ И ПРЕДАНИЯ Предание ParadosisTraditio один из терминов у которого так много значений что он рискует вовсе утерять свой первоначальный смысл. И это не только по причине некоторого обмирщения которое обесценило столько слов богословского словаря как дух...
17196. ТИПЫ РЕЛИГИОЗНОЙ ЖИЗНИ 96 KB
  Мать МАРИЯ Скобцова ТИПЫ РЕЛИГИОЗНОЙ ЖИЗНИ Если мы начнем изучать историческое место на котором мы находимся или вернее те исторические типы благочестия которые сейчас выработало наше историческое положение то мы сможем объективно и беспристрастно увидеть разн
17197. СПАСЕHИЕ И ОПРАВДАHИЕ 104 KB
  Аpхиепископ Михаил Мудьюгин СПАСЕHИЕ И ОПРАВДАHИЕ Опыт кpаткого pаскpытия пpавославной субъективной сотеpиологии Стpемление к спасению в будущей или загpобной жизни явление хаpактеpизующее духовную жизнь многих веpоятно даже большинства сознательных хpистиан. ...
17198. Замечания по поводу атеистической литературы последних лет 69 KB
  Замечания по поводуатеистической литературы последних лет. Внимательное ознакомление с весьма многочисленной антирелигиозной литературой привело меня к следующим выводам: 1. Эта литература поражает прежде всего своей невероятной отсталостью. В ней можно найти множ...
17199. О детском крещении 41 KB
  О детском крещении Что написано в Священном Писании о крещении Посмотрим основные места. 1 Мф.28:1920 Итак идите научите ВСЕ НАРОДЫ крестя их во имя Отца и Сына и Святого Духа уча их соблюдать все что Я повелел вам; и се Я с вами до скончани
17200. ПРАВОСЛАВНЫЙ ИНТЕРНЕТ В РОССИИ 114 KB
  ПРАВОСЛАВНЫЙ ИНТЕРНЕТ В РОССИИ СОДЕРЖАНИЕ: КАКИМ БУДЕТ ПРАВОСЛАВНЫЙ ИНТЕРНЕТ Москва 7 сентября Метафрасис Первая конференция посвященная перспективам развития православных ресурсов на русском языке в глобальной компьют...