Примитивы синхронизации
Примитивы взаимоисключения
- Семафоры - критическая секция с возможностью входа для нескольких потоков
- Мьютексы - бинарный семафор, имеющий два состояния: свободный и заблокированный. Бывают с рекурсивным захватом. Работают на уровне пользователя.
- Критические секции - Объект синхронизации, обычно эквивалентный мьютексу. Работают на уровне ядра.
- Спинлоки - блокировка не участков кода, а данных. Критическая секция на 1 переменную.
Принцип невероятно прост. Спинлок — это просто переменная, которая содержит ноль или единицу (бывают варианты).
Если ноль — спинлок свободен, и его можно захватить. Если не ноль — спинлок заперт, и нить, которая желает его захватить, будет ждать, крутясь (spin — вращение) в небольшом цикле непрерывной проверки освобождения спинлока.
- Мониторы - блокировка всего объекта, который работает с синхронизированной информацией для других потоков.
- Условные переменные - блокирование одного или нескольких потоков до момента поступления сигнала от другого потока о выполнении некоторого условия или до истечения максимального промежутка времени ожидания
- Сравнение с обменом - атомарная инструкция, сравнивающая значение в памяти с одним из аргументов, и в случае успеха записывающая второй аргумент в память
- RWLock - чтение блокирует запись, но не блокирует чтение других тредов, а запись блокирует все.
Примитивы управления последовательностью выполнения
- Барьеры (barrier), рандеву – примитив синхронизации во времени нескольких потоков/процессов. Поток, остановившийся на барьере, ожидает другой (другие потоки), когда они «дойдут» до этого же барьера
Другие средства
- Файл - обычный файл также является средством межпроцессорного взаимодействия
- Сигналы и сообщения - могут означать множество вещей: вызов функций, сигналы, данные.
- Сокет - программный итерфейс для обмена нанными между процессами
- Канал (Конвееер) - один процесс/поток записывает в поток ввода/вывода, а другой считывает
- Именованный канал - позволяет различным процессам обмениваться данными, даже если программы, выполняющиеся в этих процессах, изначально не были написаны для взаимодействия с другими программами
- Разделяемая память - средство синхронизации между процессами. Дополняется семафором или мьютексом
- Почтовый ящик (Mailslot) - обеспечивающий однонаправленную передачу информации и позволяющий производить широковещательную рассылку сообщений по сети
- Очередь сообщений
- Проецируемый в память файл (mmap) - для более быстрого доступа и синхранизации доступа к файлу