Pavel Vasiliev wrote: [...] > Interestingly. pthread_refcount_enroll_one() in your implementation > really eliminates need in any explicit locking.
I hope so. Yeah, as you wrote <quote> ...problem is much the same: "test and conditionally increment" </quote>. > > Your code showed also that I overlooked the more simple way to deal > with weak_count. To satisfy aesthetic feelings ^^^^^^^^^^^^^^^^^^ ;-) > I place here the corrected version of my previous code. Well, Given: two threads -- A and B, thread A has "strong" one, thread B has "weak" one, strong_count == 1, weak_count == 2. Thread A, in release_strong: atomic_decrement(&strong_count) == 0, Thread B, in acquire_strong_from_weak: lock, see atomic_increment(&strong_count) > 0, (strong_count == 1, weak_count == 2) return true (and unlock), ... enter release_strong() atomic_decrement(&strong_count) == 0, enter strong_refs_lost(), see strong_count == 0, set strong_count < 0, unlock, destroy, enter release_weak(), atomic_decrement(&weak_count) == 1, (strong_count < 0, weak_count == 1) ... enter release_weak(), atomic_decrement(&weak_count) == 0, destruct_self() Thread A, enter strong_refs_lost(): WHA.. Nah, Lukashenko retires and establishes peace and democracy in the Middle East. ``Not bad.'' ;-) Well, presuming that I'm NOT missing and/or misunderstanding something with respect to the "flow" above, a sort of "moral" is that you should better NOT increment a ZERO count... unless you *really* wish to have something along the lines of: http://groups.google.com/groups?selm=3D021EA4.E2217C09%40web.de (Subject: Re: Objects in container: creation and deletion details) with Zombies, resurrection [God rules], etceteras. And, BTW, < Forward Inline > -------- Original Message -------- Newsgroups: comp.programming.threads Subject: Re: threadsafe reference counting Alexander Terekhov wrote: > > < kinda pthread_refcount_t-"SKETCHv3" > .... Here's the "updated" SKETCH: PTHREAD_REFCOUNT_MAX // upper bound PTHREAD_REFCOUNT_INITIALIZER(N) // macro for statics INIT pthread_refcount_init() // mutex like but with initial value pthread_refcount_destroy() // also mutex like pthread_refcount_getvalue() // see "COW_AtomicInt3" string example pthread_refcount_setvalue() // see "COW_AtomicInt3" string example pthread_refcount_increment() // without any msync whatsoever pthread_refcount_add() // without any msync but with r.checking pthread_refcount_decrement() // with msync for proper mut.obj-cleanup pthread_refcount_subtract() // with msync and with r.checking pthread_refcount_decrement_nomsync() // without any msync whatsoever pthread_refcount_subtract_nomsync() // without any msync but with r.checking pthread_refcount_enroll_one() // without any msync whatsoever pthread_refcount_enroll_many() // without any msync but with r.checking pthread_refcount_attr_*() // PROCESS_SHARED and etc. attr-stuff std::size_t as "value type" // for get/set/add/... "value" param PTHREAD_REFCOUNT_DROPPED_TO_ZERO // for pthread_refcount_decrement*() // and pthread_refcount_sub() to // indicate "dropped to zero" condition // that MAY be used to safely destroy // associated ref.counted object or // simply continue -- increment/setval // also used for weak->strong "enrolls" // by pthread_refcount_enroll_one() and // pthread_refcount_enroll_many() Uhmm, as WW-aka-Attila says... Kapis? Comments/suggestions/objections/whatever? (an essay from David Butenhof would be greatly appreciated as well ;-) ) regards, alexander. -- http://www.usenix.org/publications/library/proceedings/c++94/full_papers/ellis.a _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost