- •Типы блокировок (механизмов синхронизации)
- •Определение семафора
- •Применение семафоров
- •Проблемы семафоров
- •Мьютексы в Win32 api
- •Мьютексы в Unix-подобных системах
- •Мьютексы в языке Си
- •Простейший пример взаимной блокировки
- •Специфика многопроцессорных и однопроцессорных конфигураций
- •Применение спинлоков
- •Проблемы спинлоков и методы их решения
- •Альтернативы спинлоков
- •Прочие модификации спинлоков
Альтернативы спинлоков
Спинлоки служат для обеспечения монопольного доступа потока к защищаемой структуре данных. При этом не делается ни различия между самими потоками, ни между производимыми операциями. Однако, зачастую, в реальных приложениях потоки можно разделить на «Читающие» и «Пишущие». Для данного несимметричного случая более целесообразно применять RWLock. Структура может быть одновременно использоваться неограниченным количеством потоков в режиме «только чтение», вместе с тем давая защиту целостности данных при приходе «пишущего» потока.
Существуют также алгоритмы без блокировок, основанные на атомарном детектировании коллизий. Они оптимизированы под оптимистичный случай, при котором вся проверка на коллизию сводится к одной атомарной ассемблерной операции (Compare And Swap, на x86-архитектуре команда cmpxchg)
Прочие модификации спинлоков
Спинлок с автоматическим наращиванием до захвата полноценного мьютекса после истечения какого-то количества оборотов цикла применяется, например, в критических секциях Windows для оптимизации, заключающейся в отсутствии обращений к мьютексу при отсутствии соревнования за ресурс.
Зависа́ние — компьютерное явление, при котором одна или несколько программ или вся операционная система перестают реагировать на действия пользователя, или начинают без остановки выполнять одну и ту же (не обязательно полезную или содержательную) операцию, не реагируя на сообщения от других программ. В этот момент изображение, выводимое программой на монитор (если оно есть) застывает, в отличие от ошибки исполнения, при которой на экран выдаётся сообщение.
Продолжить работу программы можно только выгрузив её из памяти и запустив на исполнение снова. В большинстве современных операционных систем предусмотрена возможность прерывания исполнения программ, например — команда kill и различные интерфейсы к ней в системах GNU/Linux, или диспетчер задач в Microsoft Windows, а также команда taskkill в Windows XP. В случае полного зависания ОС, когда она не реагирует на ввод клавиатуры или мыши, работу можно продолжить только после полной перезагрузки операционной системы.
В некоторых случаях зависание системы можно обнаружить, используя сторожевой таймер.
Причинами зависания являются ошибки в программировании, чаще всего неверное завершение циклов или, в многозадачных ОС, взаимная блокировка процессов или неправильное использование памяти программами, а также ошибки в драйверах. Кроме того, зависание может возникнуть в результате аппаратного сбоя компьютера (в частности, в результате перегрева).
Функция ожидания
Функции ожидания позволяют потоку блокировать свое собственное выполнение. Функции ожидания не возвращают ничего до тех пор, пока не будут соблюдены указанные критерии. Тип функции ожидания определяет набор используемых критериев и при вызове функции проверяет, были ли соблюдены критерии ожидания. Если критерии не были соблюдены, то вызывающий поток переходит в состояние ожидания, пока условия критериев ожидания не были выполнены или заданный интервал ожидания не истечет.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms687069(v=vs.85).aspx
Сторожевой таймер
Сторожевые или ожидающие таймеры (Waitable Timer) - объекты ядра, которые предназначены для отсчета промежутков времени. Окончание временного интервала определяется по переходу таймера в свободное состояние (signaled). Момент перехода таймера в свободное состояние определяется одной из ожидающих функций. По аналогии с радиоэлектроникой, ожидающий таймер можно представить как мультивибратор, работающий в одном из двух режимов, ожидающим запуска от внешнего сигнала или автогенераторном, когда формируется непрерывная последовательность импульсов. Основное применение ожидающих таймеров - синхронизация потоков в многопоточном программировании.
Наиболее частая область применения ожидающих таймеров - периодическое выполнение определенной задачи. Например, требуется с определенным периодом собирать данные и обрабатывать их. Ни источник данных, ни их обработка не имеют значения, главное в задаче - периодичность сбора.
Если поток, который установил таймер, уничтожается, то таймер останавливается без изменения состояния, но не уничтожается вместе с потоком. Если есть функция APC, она уничтожается, в противном случае уничтожение потока не оказывает влияния та таймер. Таймер с ручной установкой после перехода в свободное состояние остается в нем до сброса функцией SetWaitableTimer. Это касается и периодического таймера, таким образом периодический таймер с ручной установкой фактически не является периодическим таймером. В MSDN не поясняется каким образом можно полностью уничтожить ожидающий таймер, можно понимать, что не именованный таймер будет уничтожен после вызова CloseHandle, а именованный, когда последний поток вызовет CloseHandle.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms687012(v=vs.85).aspx
