Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы синхронизировать доступ к ресурсу, используйте один из объектов синхронизации в одной из функций ожидания. Состояние объекта синхронизации может быть сигнальным или несигнальным. Функции ожидания позволяют потоку блокировать своё выполнение до тех пор, пока указанный объект не перейдёт из несигнального в сигнальное состояние. Дополнительные сведения см. в разделе "Межпроцессная синхронизация".
Выбор правильного примитива синхронизации
| Примитивный | Объем | 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. Мьютексы всегда включают переход в режим ядра, что делает их значительно медленнее для высокочастотных операций в рамках одного процесса.
Ниже приведены другие механизмы синхронизации:
- перекрываемые входные и выходные данные
- асинхронные вызовы процедур
- критически важные объекты разделов
- переменные условия
- облегчённые блокировки чтения-записи
- однократная инициализация
- доступ между заблокированными переменными
- взаимосвязанные односвязные списки
- очереди таймера
- Макрос MemoryBarrier
Дополнительные сведения о синхронизации см. в разделе "Проблемы синхронизации и многопроцессоров".