kuangye <> writes:
> What's difference between memory_order_relaxed and no memory order in c
> ++0x?
>
> /*
> The following code sample is from
> http://www.justsoftwaresolutions.co....onization.html
> */
>
> std::atomic<int> x(0),y(0);
>
> void thread1()
> {
> x.store(1,std::memory_order_relaxed);
> y.store(1,std::memory_order_relaxed);
> }
>
> void thread2()
> {
> int a=y.load(std::memory_order_relaxed);
> int b=x.load(std::memory_order_relaxed);
> if(a==1)
> assert(b==1); // no guarantee that b==1 when a==1
> }
>
> std::thread t1(thread1);
> std::thread t2(thread2);
>
>
> --------------------------------------------------------------------------------------------
> If I replace the atomic<int> with int ( as the following code). what
> will happen??
Undefined behaviour. You have two non-atomic accesses to a variable, one
of which is a write, with no defined order between them. This is
therefore a data race and undefined behaviour.
> Therefor, what's difference between memory_order_relaxed and no memory
> order in c++0x?
The use of atomics with memory_order_relaxed make it defined
behaviour. With atomics, the value of x is either 0 or 1, the same for
y. With plain int the program has undefined behaviour and may format
your hard disk.
> Does memory_order_relaxed prevent c++ compiler from code reordering or
> anything else ??
It ensures that the compiler uses the correct instructions for atomic
operations on the target CPU. It also may potentially inhibit some
optimizations.
Anthony
--
Author of C++ Concurrency in Action
http://www.stdthread.co.uk/book/
just::thread C++0x thread library
http://www.stdthread.co.uk
Just Software Solutions Ltd
http://www.justsoftwaresolutions.co.uk
15 Carrallack Mews, St Just, Cornwall, TR19 7UL, UK. Company No. 5478976