bool c++ c++11 concurrency atomic interlocked

c++ - bool - ¿Por qué no se implementa completamente el doble atómico?



atomic bool c++ (2)

La biblioteca estándar ordena std::atomic<T> donde T es cualquier tipo TriviallyCopyable . Ya que double es TriviallyCopyable , std::atomic<double> debería compilarse y funcionar perfectamente bien.

Si no es así, tienes una biblioteca defectuosa.

Edición: desde el comentario aclarando la pregunta:

El estándar c ++ especifica especializaciones específicas para tipos integrales fundamentales. (es decir, los tipos que contienen enteros que deben estar presentes en el idioma). Estas especializaciones tienen requisitos adicionales para el caso general de atomic, en el sentido de que deben admitir:

  • fetch_add
  • fetch_sub
  • fetch_and
  • fetch_or
  • fetch_xor
  • operador ++
  • operador--
  • operadores de comparación y asignación

O, XOR, AND, por supuesto, no son relevantes para los tipos flotantes y, de hecho, incluso las comparaciones comienzan a ser complicadas (debido a la necesidad de manejar el épsilon). Por lo tanto, parece irrazonable exigir que los mantenedores de bibliotecas pongan a disposición especializaciones específicas cuando no hay un caso para apoyar la demanda.

Por supuesto, no hay nada que impida que un mantenedor de bibliotecas proporcione esta especialización en el improbable caso de que una arquitectura determinada admita el atómico exclusivo o de dos dobles (¡nunca lo hará!).

Mi pregunta es bastante simple. ¿Por qué no se implementa completamente std::atomic<double> ? Sé que tiene que ver con el acceso variable entrelazado. Pero realmente no veo, por qué esto no debería ser posible en un doble.

Se especifica que se puede utilizar cualquier tipo de copia trivial . Y por supuesto el doble está entre ellos. Así que las operaciones básicas deberían estar bien (configuración, lectura, etcétera). Sin embargo, en enteros es posible un conjunto adicional de operaciones (fetch_add, ++, + =, etc.).

Un doble difiere muy poco de estos tipos. Es nativo, trivalmente copiable, etc. ¿Por qué el estándar no incluyó el doble con estos tipos?


std::atomic<double> es compatible en el sentido de que puede crear uno en su programa y funcionará bajo las reglas de C ++ 11. Puede realizar cargas y almacenes con él y hacer comparaciones de intercambio y similares.

El estándar especifica que las operaciones aritméticas (+, *, + =, &, etc.) solo se proporcionan para atómicas de "tipos integrales", por lo que un std::atomic<double> no tendrá ninguna de esas operaciones definidas.

Mi entendimiento es que, dado que hay poco soporte para fetch-add o cualquier otra operación aritmética atómica para los tipos de punto flotante en el hardware que se usa hoy en día, el estándar C ++ no proporciona los operadores para ellos porque tendrían que implementarse de manera ineficiente.

(editar). Como un aparte, std::atomic<double> en VS2015RC está libre de bloqueos.