Сведения о синхронизации

Чтобы синхронизировать доступ к ресурсу, используйте один из объектов синхронизации в одной из функций ожидания. Состояние объекта синхронизации может быть сигнальным или несигнальным. Функции ожидания позволяют потоку блокировать своё выполнение до тех пор, пока указанный объект не перейдёт из несигнального в сигнальное состояние. Дополнительные сведения см. в разделе "Межпроцессная синхронизация".

Выбор правильного примитива синхронизации

Примитивный Объем Performance Реентерабельная Когда использовать
Тонкая блокировка чтения-записи (SRW) Один процесс Быстрый (обычно в пользовательском режиме; при конкуренции может перейти в режим ядра) Нет Выбор по умолчанию для нагрузок с преобладанием операций чтения в современном коде. Наименьший объем памяти (размер указателя).
Критический раздел Один процесс Быстрое (спины, затем ожидание ядра) Да Используйте, если требуется повторная блокировка или рекурсивная блокировка в рамках одного процесса. Немного больше, чем SRW.
Мьютекс Межпроцессный (именованный) Медленнее (всегда объект ядра) Да Требуется для синхронизации между процессами с помощью именованного мьютекса. Также полезно при использовании с WaitForMultipleObjects.
Семафор Межпроцессный (именованный) объект ядра N/A Ограничивает одновременный доступ к пулу ресурсов (например, пул соединений n-элементов).
Событие Межпроцессный (именованный) объект ядра N/A Сигнализация между потоками и процессами. Используйте для уведомлений "что-то произошло", а не для защиты данных.
C++ std::mutex / std::shared_mutex Один процесс Зависит от реализации Нет Рекомендуется использовать переносимый код C++ и RAII. Используйте, если не требуется API ожидания Win32 или межпроцессная синхронизация.

Note

Блокировки SRW и критические секции: для нового кода, для которого не требуется рекурсивная блокировка, предпочтительнее использовать блокировки SRW (AcquireSRWLockExclusive/AcquireSRWLockShared). Они меньше, быстрее и поддерживают семантику чтения и записи. Критические секции по-прежнему подходят, когда требуется повторный (рекурсивный) захват одним и тем же потоком.

Important

Типичная ошибка: использование мьютекса для внутрипроцессной синхронизации, когда достаточно критической секции или блокировки SRW. Мьютексы всегда включают переход в режим ядра, что делает их значительно медленнее для высокочастотных операций в рамках одного процесса.

Ниже приведены другие механизмы синхронизации:

Дополнительные сведения о синхронизации см. в разделе "Проблемы синхронизации и многопроцессоров".