30515
Средства синхронизации потоков в ОС Windows. Функции и объекты ожидания. Критические секции
Доклад
Математика и математический анализ
При создании многопоточных приложений необходимо контролировать взаимодействие отдельных потоков. Большинство ошибок при работе с потоками возникает из-за того, что во время работы приложения различные потоки пытаются обратиться к одним и тем же данным. Для предотвращения подобной ситуации в ОС Windows (как впрочем и в других операционных системах) существуют средства синхронизации, которые позволяют контролировать доступ к разделяемым ресурсам.
Русский
2013-08-24
25.71 KB
16 чел.
Средства синхронизации потоков в ОС 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.
Объекты синхронизации:
Критические секции
Критическая секция часть программы, в которой есть обращение к совместно используемым данным. При нахождении в критической секции двух (или более) процессов, возникает состояние «гонки» («состязания»). Для избежания данной ситуации необходимо выполнение четырех условий:
Критическая секция объект синхронизации потоков, позволяющий предотвратить одновременное выполнение некоторого набора операций (обычно связанных с доступом к данным) несколькими потоками. Критическая секция выполняет те же задачи, что и мьютекс.
Между мьютексом и критической секцией есть терминологические различия, так процедура, аналогичная захвату мьютекса, называется входом в критическую секцию, снятию блокировки мьютекса выходом из критической секции.
Процедура входа и выхода из критических секций обычно занимает меньшее время, нежели аналогичные операции мьютекса, что связано с отсутствием необходимости обращаться к ядру ОС.
В операционных системах семейства Microsoft Windows разница между мьютексом и критической секцией в том, что мьютекс является объектом ядра и может быть использован несколькими процессами одновременно, критическая секция же принадлежит процессу и служит для синхронизации только его потоков.
Критические секции Windows имеют оптимизацию, заключающуюся в использовании атомарно изменяемой переменной наряду с объектом «событие синхронизации» ядра. Захват критической секции означает атомарное увеличение переменной на 1. Переход к ожиданию на событии ядра осуществляется только в случае, если значение переменной до захвата было уже больше 1, то есть происходит реальное «соревнование» двух или более потоков за ресурс.
Таким образом, при отсутствии соревнования захват/освобождение критической секции обходятся без обращений к ядру.
Кроме того, захват уже занятой критической секции до обращения к ядру какое-то небольшое время ждёт в цикле опроса переменной, и, если переменная становится равной 0, то захват происходит без обращений к ядру.
Сходный объект в ядре Windows называется FAST_MUTEX (ExAcquire/ReleaseFastMutex). Он отличается от критической секции отсутствием поддержки рекурсивного повторного захвата тем же потоком.
Аналогичный объект в Linux называется фьютекс.
Функции ожидания
Объекты синхронизации используются совместно с функциями ожидания. Эти функции связываются с одним или несколькими синхронизирующими объектами и ждут, когда эти объекты перейдут в сигнальное состояние. Тем самым выполнение процесса может быть приостановлено до тех пор, пока в системе не произойдёт некоторое событие.
Ожидание одного события может быть организовано вызовом функции WaitForSingleObject:
DWORD WaitForSingleObject(
IN HANDLE hHandle,
IN DWORD dwMilliseconds
);
Параметр hHandle - дескриптор объекта синхронизации.
Параметр dwMilliseconds - время ожидания (тайм-аут) в миллисекундах.
Перед возвращением функция WaitForSingleObject изменяет состояние объекта, например, захватывает мьютекс, уменьшает число семафора на 1 и т.д.
Ожидание нескольких синхронизирующих объектов может быть организовано функцией WaitForMultipleObjects:
DWORD WaitForMultipleObjects (
IN DWORD nCount,
IN CONST HANDLE *lpHandles,
IN BOOL bWaitAll,
IN DWORD dwMilliseconds
);
Параметр lpHandles является указателем на массив дескрипторов объектов синхронизации.
Параметр nCount определяет число дескрипторов в этом массиве, используемых функцией.
Параметр bWaitAll определяет логику ожидания.
Параметр dwMilliseconds определяет время ожидания и всё, сказанное выше об аналогичном параметре функции WaitForSingleObject, относится и к данной функции.
Функция работает аналогично функции WaitForSingleObject, отличаясь только возвращаемыми значениями.
А также другие работы, которые могут Вас заинтересовать | |||
75497. | Ввод начальных остатков в ИС «1С: Предприятие» | 21 KB | |
Для ввода остатков в плане счетов конфигурации предусмотрен специальный вспомогательный счет 00. Он используется для корреспонденции с дебетом или кредитом того счета, по которому необходимо ввести остаток. | |||
75498. | Документация в БУ ИС 1С | 22.5 KB | |
Для автоматизации процесса используются следующие виды первичных стандартных документов по учету: документы движения материальных ценностей приходный ордер приемный акт накладная акт на списание требование лимитная карта... | |||
75499. | Принципы программирования дополнительных задач в ИС 1С | 23 KB | |
Наследование есть свойство объектов порождать своих потомков. Полиморфизм это свойство родственных объектов т. объектов имеющих одного общего родителя решать схожие по смыслу проблемы разными способами. Это и называется полиморфизмом объектов. | |||
75500. | Типы данных, используемые при программировании в ИС 1С | 30.5 KB | |
Типы данных используемые при программировании в ИС 1С В системе поддерживаются базовые и агрегатные типы данных. Агрегатные типы данных это специализированные типы данных предназначенные для работы с объектами 1С: Предприятия. Агрегатными типами данных называются следующие типы данных: Константа средство работы с постоянными или условно постоянными значениями. Справочник средство для ведения списков однородных элементов данных. | |||
75501. | Управляющие оператора, используемые для при программировании в 1С | 25 KB | |
Для управления логикой выполнения программы используются логические выражения и управляющие операторы. Логическое выражение записывается с помощью символов сравнения | |||
75502. | Индивидуальный пользовательский интерфейс (1С) | 107 KB | |
Индивидуальный пользовательский интерфейс 1С Индивидуальный пользовательский интерфейс включает расширенное меню и панели инструментов настроенные на работу только с той информацией доступ к которой разрешен набором прав пользователя. Внешний вид списка пользовательских интерфейсов зависит от положения переключателей Список Таблица в меню Действия главного меню Конфигуратора. Для создания нового пользовательского интерфейса необходимо выбрать пункт Новый в меню Действия главного меню конфигуратора рис. не содержит меню и... | |||
75504. | Редактор панелей инструментов (1С) | 45 KB | |
Редактор панелей инструментов 1С Для вызова редактора панелей инструментов необходимо выделить название интерфейса для которого редактируются панели и в меню Действия главного меню Конфигуратора выбрать пункт Редактировать панели инструментов рис. Окно редактора панелей инструментов Окно редактора состоит из трех основных частей. Слева вверху расположен список панелей инструментов и кнопки для создания переименования и удаления панелей. Слева внизу расположено окно с библиотекой рисунков которые могут быть размещены на кнопках... | |||
75505. | Язык SQL. Создание базы данных и таблиц | 64.5 KB | |
Создание базы данных и таблиц. Создание базы данных В различных СУБД процедура создания баз данных обычно закрепляется только за администратором баз данных. В однопользовательских системах принимаемая по умолчанию база данных может быть сформирована непосредственно в процессе установки и настройки самой СУБД. Стандарт SQL не определяет как должны создаваться базы данных поэтому в каждом из диалектов языка SQL обычно используется свой подход. | |||