Как выполнить основные операции с std :: atomic, когда тип не является Integral?

Если быть точным, мне нужно только увеличить двойное число на другое двойное и сделать так, чтобы оно было поточно-ориентированным. Я не хочу использовать мьютекс для этого, так как скорость выполнения резко снизится.

8

Решение

Как правило, стандартная библиотека 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))
;
}
14

Другие решения

Так что используйте интегральный атом в качестве барьера памяти. Вот страница с источником и объяснением: http://preshing.com/20121019/this-is-why-they-call-it-a-weakly-ordered-cpu/

-1

По вопросам рекламы [email protected]