Boost logo

Boost :

Subject: Re: [boost] Notice: Boost.Atomic (atomic operations library)
From: Peter Dimov (pdimov_at_[hidden])
Date: 2009-12-01 09:30:12


Helge Bahmann wrote:
> Hello Mikael,
>
> On Tue, 1 Dec 2009, Mikael Olenfalk wrote:
>> Hello Helge,
>>
>> I am trying to use Boost.Atomic in my project but am experiencing the
>> following two problems:
>>
>> - boost/atomic/memory_order.hpp: enum memory_order is redeclared
>> from boost/memory_order.hpp (1.37)
>
> Yes, I realized that today; the definition in boost/memory_order.hpp
> is outdated, it should be replaced with boost/atomic/memory_order.hpp
> or augmented to include "memory_order_consume" (it is contained in
> more "recent" proposals of the C++0x standard, see
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2643.html).

I will add _consume to boost/memory_order.hpp.

FWIW, the enum values in it are chosen so that one can use

if( mo & memory_order_acquire )
{
    // insert trailing fence
}

and

if( mo & memory_order_release )
{
    // insert leading fence
}

instead of a switch.

I think that your PPC trailing fence (isync) is wrong for loads. isync
should only be used after a conditional jump (if one wants acquire
semantics). For loads, you need either a trailing lwsync, or a fake
never-taken branch + isync.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2745.html

Your use of a single lock for seq_cst operations has given me pause, but now
that I've thought about it some more, I think that this is not necessary.
Per-location locks also provide sequential consistency.

There is already boost/smart_ptr/detail/spinlock_pool.hpp that you may use
for the fallback - if you like.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk