Почему не полностью реализован атомарный двойной

Мой вопрос довольно прост. Почему нет 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, конечно, не относятся к плавающим типам, и даже сравнения начинают становиться сложнее (из-за необходимости обрабатывать эпсилон). Таким образом, кажется необоснованным требовать, чтобы сопровождающие библиотеки предоставляли конкретные специализации, когда нет необходимости поддерживать спрос.

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

Другие вопросы по тегам