<Forward Inline>

Joseph Seigh wrote:
> 
> Alexander Terekhov wrote:
> >
> > Joseph Seigh wrote:
> > > Well, Detlefs calls it lock-free reference counting.  But Boost
> > > would probably call what they're doing with thread-safe reference
> > > counting lock-free also, and they are not the same.
> >
> > They don't call it "lock-free". Here's what they say:
> >
> > http://std.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1450.html
> > (A Proposal to Add General Purpose Smart Pointers to...)
> >
> > "....
> >  The count structure C has the following members:
> >
> >  Virtual table pointer (C is polymorphic);
> >  Use count;
> >  Weak count;
> >  Mutex (for multithreaded builds);
> >  Original pointer passed to the constructor;
> >  Deleter.
> >  ....
> >  The mutex presents another target for platform-specific
> >  optimizations. On Windows, we have been able to use a simple
> >  one-word spinlock instead of a 6 word CRITICAL_SECTION. The
> >  portable architecture of the implementation that abstracts
> >  the mutex concept in a separate class prevents further
> >  optimizations, like reusing the use count word as the
> >  spinlock, or using the Windows API InterlockedIncrement,
> >  InterlockedDecrement, and InterlockedCompareExchange
> >  primitives to attempt to eliminate the mutex altogether.
> >  Nevertheless, we believe that such optimizations are
> >  possible.
> >  ...."
> 
> The fact that they consider and have done simplistic spin locks
> speaks for itself.  

Yeah. http://lists.boost.org/MailArchives/boost/msg44460.php

>                     Also, they make a whole lot of distinctions
> that don't translate very well into a threaded environment.
> Their style of semantic definition with that pre and post internal
> data state stuff doesn't work in multi-threading. 

I think it's fine. Please see the definitions of shared_ptr and
weak_ptr thread "safeties" (below).
 
>                                                    The one thing
> you usually cannot reliably observe in multi-threading is internal data
> state.  You have to use other mechanisms to define semantics for
> multi-threading. 

I don't think so.
 
>                   To say nothing of their multiple attempts to
> deal with data "ownership".  It's why they have so many pointer
> types, all compromised in some degree or other for some small
> incremental benefit.

;-)

> 
> >
> > >                                                      The meaning
> > > of atomic w.r.t java pointers is or should be well understood, so
> > > atomic something would be indicated.  Also, it wouldn't preclude
> > > a non lock-free implementation, though you would lose the bemefits
> > > of lock-free.
> > >
> > > Maybe atomic_shared_ptr.
> >
> > Well, I'd love to have a policy-based framework that would
> > allow me to specify the *thread-safety policy*:
> >
> >   thread_safety::unsafe
> >
> >     "naked" count(s)
> >
> >   thread_safety::basic
> >
> >     pthread_refcount_t stuff (<http://tinyurl.com/cewa>)
> >
> >   thread_safety::strong
> >
> >     your "atomic" stuff
> >
> > or something like that. Note that for the blocking stuff, one
> > would REALLY want to have some support for priority protocols
> > (priority protection or priority inheritance) to fight the
> > "unbounded priority inversion" problem in the "realtime" apps.
> >
> 
> I'm never quite sure what "thread-safe" really means.  It seems
> to get used in different ways sometimes. 

thread_safety::unsafe means that *copying* AND all mutation 
operations on shared_ptr/weak_ptr copies (all pointing to the 
same object; "typed-null" including) shall be *synchronized*; 
otherwise, the behavior is undefined. Read-only stuff (copying
aside) can be done concurrently.

thread_safety::basic means that all "const" operations 
(including copying) can be done concurrently, but mutations 
shall be synchronized; otherwise, the behavior is undefined.

thread_safety::strong means "do-whatever-you-want-and-don't-
care-about-synchronization" (i.e. you can also mutate shared_ptr 
and weak_ptr objects *concurrently* without any synchronization
because it's fully synchronized "internally").
 
>                                          Atomic is easy to define.
> It just means that you will only ever read some previously stored
> value.

The C and C++ standards already mandate that! Here's what C99 
says, for example:

"The lifetime of an object is the portion of program execution 
 during which storage is guaranteed to be reserved for it. An 
 object exists, has a constant address, and retains its last-
 stored value throughout its lifetime."

regards,
alexander.

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to