Содержание
- 2. Межпроцессное взаимодействие Синхронизация потоков с использованием объектов ядра Windows 2000+
- 3. Синхронизация потоков Простейшей формой коммуникации потоков является синхронизация (synchronization). Синхронизация означает способность потока добровольно приостанавливать свое
- 4. Объекты синхронизации и их состояния Объекты синхронизации (synchronization objects) – это объекты ядра, при помощи которых
- 5. Объекты синхронизации MS Windows 2000+ и их состояния процессы потоки задания файлы консольный ввод уведомления об
- 6. Примеры функционирования объектов синхронизации Объект-поток находится в состоянии «занят» все время существования, но устанавливается системой в
- 7. Спящие потоки Потоки спят, пока ожидаемые ими объекты заняты (флажок опущен). Как только объект освободился (флажок
- 8. Функции ожидания DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds ); DWORD WaitForMultipleObjects( DWOHD dwCount, CONST HANDLE* phObjects,
- 9. Функция одиночного ожидания Первый параметр, hObject, идентифицирует объект ядра, поддерживающий синхронизацию. Второй параметр, dwMilliseconds, указывает, сколько
- 10. Функция множественного ожидания Функция WaitForMultipleObjects позволяет ждать освобождения сразу нескольких объектов или какого-то одного из списка
- 11. Специализированные объекты синхронизации Событие Таймер ожидания Семафор Мьютекс
- 12. События Событие – самая примитивная разновидность объектов синхронизации, которая просто уведомляют об окончании какой-либо операции. События
- 13. Сравнение работы события с ручным сбросом и автосбросом событие с ручным сбросом событие с автоматическим сбросом
- 14. Применение «событий» Объекты-события обычно используют в том случае, когда какой-то поток выполняет инициализацию, а затем сигнализирует
- 15. Создание объекта типа «событие» HANDLE CreateEvent ( LPSECURITY_ATTRIBUTES lpEventAttributes, // атрибуты // защиты BOOL bManualReset, //
- 16. Совместное использование объекта «события» процессами Если объект «событие» успешно создан, то CreateEvent () возвращает дескриптор объекта
- 17. Открытие объекта типа «событие» HANDLE OpenEvent( DWORD dwDesiredAccess, // режим доступа BOOL bInheritHandle, // флаг наследования
- 18. Режимы доступа к «событиям» EVENT_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа) EVENT_MODIFY_STATE – обеспечивает
- 19. Управление «событиями» Перевод события в свободное состояние: BOOL SetEvent (HANDLE hEvent); Перевод события в занятое состояние:
- 20. Особенности PulseEvent Функция PulseEvent () устанавливает событие и тут же переводит его обратно в сброшенное состояние,
- 21. Пример использования «события» для синхронизации потоков
- 22. Таймеры ожидания Таймеры ожидания (waitable timers) – это объекты ядра, которые самостоятельно переходят в свободное состояние
- 23. Создание и открытие таймера ожидания HANDLE CreateWaitableTimer ( LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибуты защиты BOOL bManualReset,// тип
- 24. Режимы доступа к таймеру TIMER_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа) TIMER_MODIFY_STATE – определяет
- 25. Управление таймером ожидания BOOL SetWaitableTimer( HANDLE hTimer, const LARGE_INTEGER *pDueTime, LONG lPeriod, LPTIMERAPCROUTINE pfnCompletionRoutine, LPVOID pvArgToCompletionRoutine,
- 26. Запуск таймера ожидания Параметры pDuеТimе и lPeriod функции SetWaitableTimer () задают соответственно, время когда таймер должен
- 27. Отмена действия таймера Для отмены действия таймера ожидания следует использовать функцию CancelWaitableTimer (), после ее применения
- 28. Создание объекта типа «семафор» HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // атрибуты защиты LONG lInitialCount, // начальное значение
- 29. Открытие объекта типа «семафор» HANDLE OpenSemaphore( DWORD fdwAccess, // режим доступа BOOL fInherit, // флаг наследования
- 30. Режимы доступа к семафору SEMAPHORE_ALL_ACCESS – полный доступ (разрешены все возможные виды доступа) SEMAPHORE_MODIFY_STATE – определяет
- 31. Захват семафора Для прохождения через семафор (захвата семафора) необходимо использовать функции WaitForSingleObject () или WaitForMultipleObject ().
- 32. Освобождение семафора Для увеличения значения счетчика семафора приложение должно использовать функцию ReleaseSemaphore (). Функция ReleaseSemaphore ()
- 33. Функция ReleaseSemaphore BOOL ReleaseSemaphore( HANDLE hSemaphore, // дескриптор семафора LONG lReleaseCount, // значение инкремента LPLONG lplPreviousCount
- 34. Определение текущего состояния семафора Заметим, что в операционной системе Windows не предусмотрено средств, с помощью которых
- 35. Создание и открытие мьютекса HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибуты защиты BOOL bInitialOwner, // начальное состояние
- 36. Режимы доступа к мьютексу MUTEX _ALL_ACCESS – полный доступ (разрешены все возможные виды доступа) MUTEX _MODIFY_STATE
- 37. Управление мьютексом Для захвата мьютекса необходимо использовать одну из Wait-функций. Для освобождения мьютекса используется функция ReleaseMutex
- 38. Межпроцессное взаимодействие Критические секции в Win32 API
- 39. Критические секции В составе API ОС Windows имеются специальные и эффективные функции для организации входа в
- 40. Функции Win32 API для работы с критическими секциями Для работы с критическими секциями используют функции: InitializeCriticalSection
- 41. Структура типа CRITICAL_SECTION typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // исп. ОС LONG LockCount; // счетчик
- 42. Основные поля структуры CRITICAL_SECTION Поле LockCount увеличивается на единицу при каждом вызове EnterCriticalSection() и уменьшается при
- 43. Вход в свободную секцию Если при попытке входа в критическую секцию, LockCount уже равен 0, т.е.
- 44. Вход в занятую секцию При попытке входа в занятую критическую секцию, (LockCount > 0) проверяется поле
- 45. Освобождение секции Поток-владелец при вызове LeaveCriticalSection() уменьшает поле RecursionCount на единицу и проверяет его. Если значение
- 46. Иллюстрация использования критической секции
- 47. Критические секции в многопроцессорных системах Поле SpinCount используется только многопроцессорными системами. В однопроцессорных системах, если критическая
- 48. Пример использования критической секции CRITICAL_SECTION cs; DWORD WINAPI SecondThread() { InitializeCriticalSection(&cs); EnterCriticalSection(&cs); //…критический участок кода LeaveCriticalSection(&cs);
- 49. Использование нескольких критических секций В том случае, когда процесс работает с двумя ресурсами, доступ к которым
- 50. Опасный код Поток 1. EnterCriticalSection(&cs1); EnterCriticalSection(&cs2); //…критический участок кода LeaveCriticalSection(&cs2); LeaveCriticalSection(&cs1); Поток 2. EnterCriticalSection(&cs2); EnterCriticalSection(&cs1); //…критический
- 51. Правила хорошего тона Критические секции должны быть короткими. Критических секций не должно быть много. Критическая секция
- 52. Реализация критических секций Функции EnterCriticalSection () и LeaveCriticalSection () реализованы на основе атомарных Interlocked-функций, поэтому они
- 53. Сравнение инструментов синхронизации Windows 2000+
- 54. Межпроцессное взаимодействие Атомарные операции и lockless программирование
- 55. Lockless программирование Lockless программирование – разработка неблокирующих многопоточных приложений. Отказ от использования блокирующих примитивов типа мьютексов
- 56. Атомарные операции как lockless-инструмент Простейшим способом lockless-программирования является активное использованием атомарных операций при конкурентном доступе нескольких
- 57. Виды атомарных операций Все инструкции вида Операция Регистр-Регистр можно считать атомарными так как регистры за пределами
- 58. Реализация атомарных операций в Windows 2000+ Для увеличения значения целочисленных переменных –InterlockedIncrement, InterlockedIncrement64. Для уменьшения значения
- 59. Пример кода с использованием атомарной операции static DWORD array [100]; … for (int i = 0;
- 60. Эффект переупорядочивания Поток 1: result = 7; flag = TRUE; Поток 2: if (flag) show(result); Какое
- 61. Переупорядочивание и модель памяти Чтение или запись не всегда будет происходить в том порядке, который указан
- 62. «Сильная» и «слабая» модели памяти Модель памяти, в которой нет переупорядочиваний чтения и записи будет считаться
- 63. Сводная таблица для некоторых архитектур
- 64. Барьеры памяти и оптимизации Для борьбы с переупорядочиванием применяются так называемые барьеры памяти (memory barrier или
- 65. Полные барьеры Полный барьер (full fence) предотвращает любые переупорядочивания операций чтения или записи через него. Можно
- 66. Двухсторонние барьеры Двусторонние барьеры (Store fence и Load fence) предотвращают переупорядочивание лишь одного вида операций. Барьер
- 67. Односторонние барьеры Односторонние барьеры обычно реализуют одну из двух семантик – write release (store release) или
- 68. Управление переупорядочиванием в MS VC MS VC для предотвращения переупорядочивания инструкций со стороны компилятора предлагает использовать
- 69. Неявные барьеры в MS VC 2005 В случае MS VC 2005+ ключевое слово volatile приобретает значение,
- 70. Пример решения проблемы переупорядочивания Поток 1: result = 7; // store _WriteBarrier(); flag = TRUE; //
- 72. Скачать презентацию