У меня есть неатомный 62-битный двойной, который регулярно увеличивается в одном потоке. Этот доступ не обязательно должен быть атомарным. Однако эта переменная иногда читается (не написана) другим потоком. Если я выровняю переменную на 64-битной границе, чтение будет атомарным.Прочитать неатомную переменную атомарно?
Однако, есть ли способ, которым я могу убедиться, что я не читаю переменную в середине приращения? Могу ли я вызвать инструкцию CPU, которая сериализует конвейер или что-то еще? Память барьер?
Я думал об объявлении переменной атома и используя std::memory_order::memory_order_relaxed
в моей критической ветке (и более строгий барьер памяти в редкой ветке), но, похоже, это так же дорого.
Используйте '' удобства. Все остальное приводит к неопределенному поведению. Если вы * знаете, что согласованные 64-битные чтения являются атомарными, то вы, вероятно, можете доверять своему компилятору и знать об этом. –
@ Kerrek SB: вы правы (несмотря на то, что библиотечные писатели заведомо плохи с многопоточным движением, они, наконец, догоняют). Однако при использовании нужно понимать, что происходит «под капотом», или удар производительности может быть огромным. Ответ harold можно рассматривать как объяснение _why_ некоторые вещи быстрее при использовании атомистики (например, я ожидаю, что из-за этого хорошая реализация на многих платформах заставит store (load() + 1) порядок больше, чем атомный приращение, хотя он, безусловно, имеет разную семантику и не всегда уместен). –