Существуют ли типы, которые я могу прочитать или изменить или сравнить по-своему по умолчанию? Или я должен использовать атомарные операции явно для ВСЕХ типов для ВСЕХ операций?Атомные инструкции и атомный тип
ответ
Да, вы должны всегда использовать атомные типы или атомные операции, если вам нужна атомарность. Ничего другого.
Формально ни один неатомный тип не предоставляет атомный доступ по умолчанию. В действительности, с текущими процессорами, любой встроенный тип может быть прочитан и написан (но не изменен) атомарно. Тем не менее, это не то, за что у вас есть гарантия, и определенно не то, на что вы должны положиться. Это всего лишь деталь реализации.
Все считывания и записи на текущих процессорах проходят через кеш. Только полные строки кэша (как правило, что-то около 64-128 байт) могут быть считаны из основной памяти или записаны обратно, а строки кэша кратны размеру самого большого встроенного типа. Это означает, что если тип правильно выровнен, он обязательно содержится в одной строке кэша, что автоматически делает чтение или запись атомарным. Однако , изменяющий, является операцией чтения-изменения-записи, что подразумевает, что даже если каждый шаг является атомарным как таковым, вся операция не является.
Существует намного больше атомарности, чем просто возможность атомарного считывания (или изменения) значения, например, существуют гарантии порядка, которые могут потребоваться для правильности. Даже если чтение и запись являются атомарными, ваш код не будет работать должным образом, если изменения не будут рассматриваться другим процессором в том порядке, в котором вы ожидали. Компиляторы и процессоры (в некоторых разумных пределах) позволяют изменять порядок инструкций, включая нагрузки и магазины. Это может, однако, означать, что ваш код будет работать неправильно.
Атомные операции, следовательно, имеют связанную с ними «модель памяти», которая позволяет вам предоставлять дополнительную информацию о том, что происходит, - перед гарантиями, которые необходимы между потоками и между связанными или несвязанными данными. См. GCC Wiki для хорошего описания каждого режима.
По умолчанию атомные операции выбирают последовательно последовательную модель, которая является самым безопасным режимом с самыми строгими ограничениями. Вы можете выбрать другую модель, если знаете, что вам не нужны определенные гарантии, которые могут (или не могут, в зависимости от архитектуры) привести к созданию более совершенного кода.
Приятная вещь с моделями памяти заключается в том, что они абстрагируют детали реализации, архитектурные особенности и компилятор voodoo в форме, которая описывает ваши алгоритмические требования и гарантирует выполнение этих требований.
Часто компилятор может использовать обычные неатомные машинные инструкции и по-прежнему гарантировать, что ваши требования выполнены (возможно, это должно было лишиться того или иного переупорядочения). Это зависит от фактических данных о том, как работает целевое оборудование и какие гарантии вам нужны.
В целом, использование моделей атомистики и памяти не только более комфортно, но и менее подвержено ошибкам, чем удары с ним вручную на низком уровне (встроенный ассемблер), также, вероятно, самый эффективный подход.
Отъезд http://en.cppreference.com/w/cpp/atomic/atomic.
В нем упоминается std::atomic<T>
, так же как @IgorTandetnik упоминается в одном из комментариев.
- 1. Атомные инструкции | Сохранение согласованности данных
- 2. атомные операции и атомные транзакции
- 3. Как реализовать AtomicU32, атомный 32-разрядный целочисленный тип?
- 4. Как я могу использовать инструкции «красный» и «атомный» PTX в коде CUDA C++?
- 5. C++ 11 многопоточности замки и атомные примитивы
- 6. безопасности Тип и инструкции NEG
- 7. неразрушающий атомный add?
- 8. Атомные счетчики в DynamoDB
- 9. C++, как определить пользовательские атомный тип данных
- 10. C# атомный ссылочный тип, эквивалентный атому clojure
- 11. не может создать тип перечисления как атомный
- 12. неатомные и атомные потоки небезопасны в объективе c?
- 13. Модели UnitOfWork и атомные операции
- 14. Перейти атомные и память порядка
- 15. Кэширование APC и атомные операции
- 16. атомные записи и изменчивые чтения
- 17. std :: атомные и многоядерные процессоры
- 18. Ложные обменные и атомные переменные
- 19. Атомные битпольные операции на 80x86?
- 20. Атомные операции с отображенными в памяти файлами
- 21. OpenGL атомный счетчик эквивалентен в CUDA
- 22. python атомные типы данных
- 23. OpenMP атомные и неатомическое чтения/записи дают одинаковые инструкции по x86_64
- 24. Атомные операции над суперскалярным процессором
- 25. атомный тест boto3 и создать?
- 26. Are + =, | =, & = и т. Д. Атомный?
- 27. атомный инкремент и вернуть счетчик
- 28. Erlang ETS атомный и изолированный
- 29. Атомные операции и генерация кода для gcc
- 30. AtomicInteger атомный
@Damon Я думаю, вы должны это ответить – Slava
'std :: atomic' - это тип, который вы всегда читаете и изменяете атомарно (точнее, преобразование в 'T' автоматически выполняет атомную нагрузку и назначение из 'T' выполняет атомный магазин). Я не уверен, что вы подразумеваете под «сравнить атомарно». –