std::atomic<> for double

Marc Glisse marc.glisse@inria.fr
Sat Apr 21 09:37:00 GMT 2012


On Sat, 21 Apr 2012, niXman wrote:

> where is a code that compiles and works as expected:
> #include <atomic>
> #include <iostream>
>
> int main() {
>   std::atomic<int> i(0);
>   i += 3;
>
>   std::cout << i << std::endl;
> }
> http://liveworkspace.org/code/eb92d1706687414dd3f49976584ff337
>
> now change it to type double:
> #include <atomic>
> #include <iostream>
>
> int main() {
>   std::atomic<double> i(0);
>   i += 3.14;
>
>   std::cout << i << std::endl;
> }
> http://liveworkspace.org/code/555191936a23b06352220ff11b1e33df
>
> and get the following error:
>> source.cpp: In function 'int main()':
>> source.cpp:6:9: error: no match for 'operator+=' in 'i += 3.1400000000000001e+0'
>
> therefore, I have two questions:
> 1. сan double be actually an atomic type?

Yes, because it is trivially copyable.

> 2. how is supposed to use atomic <double> by standard?

double isn't an integral type, so you can't do much more than store, load, 
exchange and compare_exchange_{weak,strong}. For your case, you get the 
double value from the atomic, increment it, then use compare_exchange to 
store that new value in the atomic *if the atomic hasn't changed in the 
meantime*, and if the atomic has changed, try again. Note that the 
comparison is done with memcmp, not ==, which for double could be 
different.

example from the standard:

expected = current.load();
do {
   desired = function(expected);
} while (!current.compare_exchange_weak(expected, desired));


Note that there are already books available to learn these things, search 
for instance for "C++ Concurrency in Action".

-- 
Marc Glisse



More information about the Gcc-help mailing list