Разница между блокируемым доступом к переменным и критическим сечениями
Может ли кто-нибудь помочь объяснить разницу между блокируемым доступом к переменным И критическим разделам с инкрементным шагом в C++? спасибо, высоко ценится, заранее.
3 ответа
В основном все те InterlockedXXX
функции являются более или менее встроенными, которые отображаются на относительно небольшое количество (обычно одной) инструкций по сборке. Такая операция не может быть прервана и поэтому считается атомарной (атомарность достигается на уровне процессора, по крайней мере, если это возможно на целевой платформе).
CRITICAL_SECTION
примитив синхронизации, который может защищать более длинные разделы Это действительно делает блокировку, и конкурирующие потоки будут вынуждены ждать, пока поток не освободит владение критической секцией.
Критические разделы являются примитивами ОС, но они ограничены одним процессом. Их старший брат критической секции под Windows - это Mutex
, который можно использовать для межпроцессной синхронизации.
Использовать InterlockedXXX
функционирует, если можете (например, нет смысла использовать полный объект критического сечения для защиты одного счетчика). Возможно, вы захотите взглянуть на различные прототипы и их использование заранее. Многие люди используют критические разделы, где InterlockedCompareExchange
сделал бы...
По сути, блокированные функции имеют ту же концепцию, что и критическая секция, но они реализованы аппаратно для определенных операций - блокировка, управление, разблокировка. Это может сделать их намного быстрее, но ограничивает их применимость. Критические разделы гораздо более общие, но относительная стоимость их использования выше. У них также есть проблемы, такие как условия гонки и тупики.
Критическая секция - это замок. InterlockedXxx
вызов функции является атомарной операцией - без блокировки. Вы можете построить либо с точки зрения другого, но на практике они имеют очень разные характеристики производительности (блокированные функции обычно быстрее).