Почему не полностью реализован атомарный двойной
Мой вопрос довольно прост. Почему нет std::atomic<double>
реализован полностью? Я знаю, что это связано с блокированным доступом к переменным. Но я действительно не понимаю, почему это не должно быть возможно на двойной.
Указано, что можно использовать любой тривиально копируемый тип. И, конечно, двойной среди них. Таким образом, основные операции должны быть в порядке (установка, чтение и так далее). Однако для целых чисел возможен дополнительный набор операций (fetch_add, ++, += и т. Д.).
Двойник очень мало отличается от этих типов. Он является родным, легко копируемым и т. Д. Почему стандарт не включает в себя тип double с этими типами?
2 ответа
std::atomic<double>
поддерживается в том смысле, что вы можете создать его в своей программе, и он будет работать по правилам C++11. Вы можете выполнять загрузки и склады с ним и делать сравнение-обмен и тому подобное.
Стандарт определяет, что арифметические операции (+, *, +=, & и т. Д.) Предоставляются только для атомик "целочисленных типов", поэтому std::atomic<double>
не будет определена ни одна из этих операций.
Насколько я понимаю, из-за слабой поддержки операций выборки-добавления или любых других атомарных арифметических операций для типов с плавающей запятой в используемом сегодня оборудовании стандарт C++ не предоставляет операторы для них, поскольку они должны быть реализованы неэффективно.
(редактировать). Как в сторону, std::atomic<double>
в VS2015RC без блокировки.
Стандартные библиотечные мандаты std::atomic<T>
где Т любой TriviallyCopyable
тип. поскольку double
является TriviallyCopyable
, std::atomic<double>
должен компилироваться и работать на отлично
Если это не так, у вас есть неисправная библиотека.
пример: http://goo.gl/QhaphY
Изменить: так как комментарий уточняющий вопрос:
Стандарт C++ определяет конкретные специализации для фундаментальных целочисленных типов. (т.е. типы, которые содержат целые числа, которые должны присутствовать в языке). У этих специализаций есть дополнительные требования к общему случаю атомарности, которые они должны поддерживать:
- fetch_add
- fetch_sub
- fetch_and
- fetch_or
- fetch_xor
- оператор ++
- operator--
- операторы сравнения и присваивания
ИЛИ, XOR и AND, конечно, не относятся к плавающим типам, и даже сравнения начинают становиться сложнее (из-за необходимости обрабатывать эпсилон). Таким образом, кажется необоснованным требовать, чтобы сопровождающие библиотеки предоставляли конкретные специализации, когда нет необходимости поддерживать спрос.
Конечно, ничто не может помешать сопровождающему библиотеки предоставить эту специализацию в маловероятном случае, когда данная архитектура поддерживает атомарное исключение или две двойные (это никогда не будет!).