Если быть точным, мне нужно только увеличить двойное число на другое двойное и сделать так, чтобы оно было поточно-ориентированным. Я не хочу использовать мьютекс для этого, так как скорость выполнения резко снизится.
Как правило, стандартная библиотека C ++ старается предоставлять только те операции, которые могут быть эффективно реализованы. За std::atomic
это означает операции, которые могут быть выполнены без блокировки в одной или двух инструкциях на «общих» архитектурах. «Обычные» архитектуры имеют атомарные инструкции извлечения и добавления для целых чисел, но не для типов с плавающей запятой.
Если вы хотите реализовать математические операции для атомарных типов с плавающей запятой, вам придется сделать это самостоятельно с помощью цикла CAS (сравнение и своп) (Жить в Колиру):
std::atomic<double> foo{0};
void add_to_foo(double bar) {
auto current = foo.load();
while (!foo.compare_exchange_weak(current, current + bar))
;
}
Так что используйте интегральный атом в качестве барьера памяти. Вот страница с источником и объяснением: http://preshing.com/20121019/this-is-why-they-call-it-a-weakly-ordered-cpu/