Почему atomic double не реализован полностью

мой вопрос довольно прост. Почему не std::atomic<double> полностью реализован? Я знаю, что это связано с блокировкой переменной. Но я действительно не понимаю, почему это не должно быть возможно на двойном.

указано, что any тривиально копируемым тип можно использовать. И конечно двойная среди них. Таким образом, основные операции должны быть прекрасными (настройка, чтение и т. д.). Однако на целых числах возможен дополнительный набор операций (fetch_add, ++, +=, п.)

двойник очень мало отличается от этих типов. Это родной, trivally копировать и т. д. Почему стандарт не включал двойника с такими типами?

2 ответов


std::atomic<double> поддерживается в том смысле, что вы можете создать его в своей программе, и он будет работать по правилам C++11. Вы можете выполнять нагрузки и магазины с ним и делать compare-exchange и тому подобное.

стандарт указывает, что арифметические операции (+, *, +=, &, etc.) предусмотрены только для атомов "интегральных типов", поэтому std::atomic<double> не будет иметь ни одной из этих операций.

Я понимаю, что, потому что есть небольшая поддержка fetch-add или любые другие атомарные арифметические операции для типов с плавающей запятой в аппаратных средствах, используемых сегодня, стандарт C++ не предоставляет операторов для них, потому что они должны быть реализованы неэффективно.

(редактировать). В сторону,std::atomic<double> в VS2015RC без блокировки.


стандартные мандаты библиотеки std::atomic<T> где T-любое TriviallyCopyable тип. С double и TriviallyCopyable, std::atomic<double> должен компилироваться и работать отлично.

если это не так, у вас есть неисправный библиотека.

пример:http://goo.gl/QhaphY

Edit: поскольку комментарий уточняет вопрос:

стандарт c++ определяет конкретные специализации для фундаментальных интегральных типов. (т. е. типы, содержащие обязательные целые числа присутствовать на языке). Эти специализации имеют дополнительные требования к общему случаю атома, в том, что они должны поддерживать:

  • fetch_add
  • fetch_sub
  • fetch_and
  • fetch_or
  • fetch_xor
  • оператор++
  • оператор--
  • операторы сравнения и назначения

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

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