CRITICAL_SECTION для установки и получения одного значения bool

теперь записывает сложный class и чувствует, что я использую много CRITICAL_SECTION.

Насколько я знаю, существуют атомарные операции для некоторых типов, которые всегда выполняются без какого-либо аппаратного или программного прерывания.

Я хочу проверить, правильно ли я все понимаю.

  • Чтобы установить или получить атомное значение, нам не нужно CRITICAL_SECTION, потому что при этом не будет прерываний.
  • bool является атомарным.

Итак, есть мои утверждения, вы хотите спросить, правильны ли они, и если они верны, какие типы переменных также могут быть установлены или получить без CRITICAL_SECTION?

Р. S. Я говорю о том, чтобы получить или установить одно значение для каждого метода, а не два, а не пять, но один.

Ответ 1

  • Вам не нужны блокировки вокруг атомных данных, но внутри они могут блокироваться. Например, С++ 11 std::atomic имеет функцию is_lock_free.
  • bool может быть не атомарным. См. здесь и здесь

Ответ 2

Примечание. Этот ответ относится к Windows и ничего не говорит о других платформах.

Нет функций InterlockedRead или InterlockedWrite; простые чтения и записи с правильным целым размером (и выравниванием) являются атомарными в Windows ( "Простые чтения и записи в правильно выровненные 32-битные переменные являются атомарными операциями." ).

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

Однако чтение и изменение таких переменных (или любой другой переменной) не являются атомарными:

  • Прочитайте bool? Хорошо. Test-And-Set a bool? Лучшее использование InterlockedCompareExchange.
  • Перезаписать целое число? Великий! добавить в Это? Критический раздел.

Ответ 3

Здесь можно найти:

Простые чтения и записи для правильно выровненных 64-битных переменных атомный на 64-битной Windows. Чтение и запись в 64-битные значения не гарантированно быть атомарным на 32-битной Windows. Читает и пишет переменные других размеров не гарантируются как атомарные платформы.

Результат должен быть правильным, но в программировании лучше не доверять. По-прежнему остается небольшая вероятность сбоя из-за кэша процессора.

Ответ 4

Вы не можете гарантировать для всех реализаций/платформ/компиляторов, что bool, или любой другой тип или большинство операций являются атомарными. Итак, нет, я не верю, что ваши утверждения верны. Вы можете переделать свою логику или использовать другие способы установления атомарности, но вам, вероятно, не удастся просто удалить использование CRITICAL_SECTION, если вы полагаетесь на нее.