Boost logo

Boost :

From: Talbot, George (Gtalbot_at_[hidden])
Date: 2006-11-13 11:36:44


OK...attached is a test version of atomic_shared.h that does implements
this using pthread_spin_lock/pthread_spin_unlock. Let me know if it
looks sane whatsoever.

Now I just saw the post by Chris Thomasson--is there a way to write
something like atomic_shared without the spinlocks? I'm looking for a
class that's as easy to use as shared_ptr, but that is read/write
thread-safe and supports compare_and_set/swap. I'm not worrying about
the ABA problem just yet.

I also do not have a good answer to the post by Sohail Somani about what
the compiler will do with this in the future.

Note that I implemented atomic_shared::compare_and_set(), not
compare_and_swap().

--
George T. Talbot
<gtalbot_at_[hidden]>
> -----Original Message-----
> From: boost-bounces_at_[hidden]
[mailto:boost-bounces_at_[hidden]]
> On Behalf Of Peter Dimov
> Sent: Friday, November 10, 2006 1:21 PM
> To: boost_at_[hidden]
> Subject: Re: [boost]boost::shared_ptr<>::compare_and_swap()--
> AmIinsaneforwanting this?
> 
> Talbot, George wrote:
> 
> > Wow...this is great!  I think I may try to code up a wrapper that
> > privately inherits from shared_ptr and just provides the spinlock
> > around
> > the operations, as a proof-of-concept.  I'm doing this on Linux on
x86
> > right now (32-bit).  Should I use this spinlock implementation:
> > http://en.wikipedia.org/wiki/Spinlock
> 
> To be on the safe side, you'll probably need something a bit more
> elaborate
> than that:
> 
> for( int i = 0; i < 4; ++i )
>     if( atomic_exchange( &spinlock, 1 ) == 0 ) return; // got spinlock
> 
> // we probably need to yield to the thread holding the lock
> 
> for( int i = 0; i < 32; ++i )
> {
>     if( atomic_exchange( &spinlock, 1 ) == 0 ) return; // got spinlock
>     sched_yield();
> }
> 
> // we might need to yield to a lower-priority thread holding the lock
> 
> for( ;; )
> {
>     if( atomic_exchange( &spinlock, 1 ) == 0 ) return; // got spinlock
>     nanosleep( some-small-value );
> }
> 
> where 4 and 32 are fudge factors. But the simple version will work for
a
> proof of concept.
> 
> On Linux, it seems easiest to just use pthread_spin_lock/unlock for
the
> prototype.
> 
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost



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