CRITICAL_SECTION для установки и получения одного значения bool
теперь записывает сложный class
и чувствует, что я использую много CRITICAL_SECTION
.
Насколько я знаю, существуют атомарные операции для некоторых типов, которые всегда выполняются без какого-либо аппаратного или программного прерывания.
Я хочу проверить, правильно ли я все понимаю.
- Чтобы установить или получить атомное значение, нам не нужно
CRITICAL_SECTION
, потому что при этом не будет прерываний. -
bool
является атомарным.
Итак, есть мои утверждения, вы хотите спросить, правильны ли они, и если они верны, какие типы переменных также могут быть установлены или получить без CRITICAL_SECTION
?
Р. S. Я говорю о том, чтобы получить или установить одно значение для каждого метода, а не два, а не пять, но один.
Ответы
Ответ 2
Примечание. Этот ответ относится к Windows и ничего не говорит о других платформах.
Нет функций InterlockedRead или InterlockedWrite; простые чтения и записи с правильным целым размером (и выравниванием) являются атомарными в Windows ( "Простые чтения и записи в правильно выровненные 32-битные переменные являются атомарными операциями." ).
(и проблем с кешем не существует, поскольку правильно выровненная переменная всегда находится в одной строке кэша).
Однако чтение и изменение таких переменных (или любой другой переменной) не являются атомарными:
- Прочитайте
bool
? Хорошо. Test-And-Set abool
? Лучшее использование InterlockedCompareExchange. - Перезаписать целое число? Великий! добавить в Это? Критический раздел.
Ответ 3
Здесь можно найти:
Простые чтения и записи для правильно выровненных 64-битных переменных атомный на 64-битной Windows. Чтение и запись в 64-битные значения не гарантированно быть атомарным на 32-битной Windows. Читает и пишет переменные других размеров не гарантируются как атомарные платформы.
Результат должен быть правильным, но в программировании лучше не доверять. По-прежнему остается небольшая вероятность сбоя из-за кэша процессора.
Ответ 4
Вы не можете гарантировать для всех реализаций/платформ/компиляторов, что bool,
или любой другой тип или большинство операций являются атомарными. Итак, нет, я не верю, что ваши утверждения верны. Вы можете переделать свою логику или использовать другие способы установления атомарности, но вам, вероятно, не удастся просто удалить использование CRITICAL_SECTION
, если вы полагаетесь на нее.