Примитивы синхронизации

Примитивы взаимоисключения

  • Семафоры - критическая секция с возможностью входа для нескольких потоков
    • Мьютексы - бинарный семафор, имеющий два состояния: свободный и заблокированный. Бывают с рекурсивным захватом. Работают на уровне пользователя.
    • Критические секции - Объект синхронизации, обычно эквивалентный мьютексу. Работают на уровне ядра.
    • Спинлоки - блокировка не участков кода, а данных. Критическая секция на 1 переменную.

Принцип невероятно прост. Спинлок — это просто переменная, которая содержит ноль или единицу (бывают варианты).

Если ноль — спинлок свободен, и его можно захватить. Если не ноль — спинлок заперт, и нить, которая желает его захватить, будет ждать, крутясь (spin — вращение) в небольшом цикле непрерывной проверки освобождения спинлока.

  • Мониторы - блокировка всего объекта, который работает с синхронизированной информацией для других потоков.
    • Условные переменные - блокирование одного или нескольких потоков до момента поступления сигнала от другого потока о выполнении некоторого условия или до истечения максимального промежутка времени ожидания
    • Сравнение с обменом - атомарная инструкция, сравнивающая значение в памяти с одним из аргументов, и в случае успеха записывающая второй аргумент в память
    • RWLock - чтение блокирует запись, но не блокирует чтение других тредов, а запись блокирует все.

Примитивы управления последовательностью выполнения

    • Барьеры (barrier), рандеву – примитив синхронизации во времени нескольких потоков/процессов. Поток, остановившийся на барьере, ожидает другой (другие потоки), когда они «дойдут» до этого же барьера

Другие средства

    • Файл - обычный файл также является средством межпроцессорного взаимодействия
    • Сигналы и сообщения - могут означать множество вещей: вызов функций, сигналы, данные.
    • Сокет - программный итерфейс для обмена нанными между процессами
    • Канал (Конвееер) - один процесс/поток записывает в поток ввода/вывода, а другой считывает
    • Именованный канал - позволяет различным процессам обмениваться данными, даже если программы, выполняющиеся в этих процессах, изначально не были написаны для взаимодействия с другими программами
    • Разделяемая память - средство синхронизации между процессами. Дополняется семафором или мьютексом
    • Почтовый ящик (Mailslot) - обеспечивающий однонаправленную передачу информации и позволяющий производить широковещательную рассылку сообщений по сети
    • Очередь сообщений
    • Проецируемый в память файл (mmap) - для более быстрого доступа и синхранизации доступа к файлу