Я пытаюсь выполнить добавление к двойному атомарно в цикле, используя схему сравнения и обмена с этой функцией:
namespace my
{
template<typename value_type>
value_type atomic_add(std::atomic<value_type>& operand, value_type value_to_add)
{
value_type old = operand.load(std::memory_order_consume);
value_type desired = old + value_to_add;
while (!operand.compare_exchange_weak(old, desired, std::memory_order_release, std::memory_order_consume))
desired = old + value_to_add;
return desired;
}
}
Это используется в моем коде так:
[ size of containers = 62, scalar = 318.0, values in containers between 0.0 and 55.0, all values are of type double ]
for(size_t i = 0; i < container.size(); i++)
{
my::atomic_add<double>(Q, container2[i] - std::pow(container3[i], 2) / scalar);
}
Выход 0.57784502195324539
.
Однако замена всех my_atomic на оператор +=
и замена всех std::atomic<double>
на double
дает 0.52something
, что ближе к тому, что я ожидал.
Любая идея, почему это происходит?
Спасибо.
std::atomic_fetch_add
? - person Arunmu   schedule 30.11.2016std::atomic_fetch_add
работает только для целочисленных типов. В этом случае мне нужны поплавки. - person Vicks   schedule 01.12.2016