Pavel Vasiliev wrote:
> May be the following code answers the challenge? :-).

Interesting...

[...]

> void weak_ref_control_block::release_strong()
> {
>     if(atomic_decrement(&strong_count) == 0)
>         strong_refs_lost();
> }

> bool weak_ref_control_block::acquire_strong_from_weak()
> {
>     scope_lock lock(mutex_destruct);
>     if(atomic_increment(&strong_count) > 0)
>         return true;
>
>     atomic_set(&strong_count, atomic_int_type_MIN);
>     return false;
> }

Thread A, in release: atomic_decrement(&strong_count) == 0
Thread B, in acquire: atomic_increment(&strong_count) > 0, return true
Thread A: strong_refs_lost(); // oops, B hates us at this point

Isn't this a problem? Not that I want to break it... I'd like a lock-less
implementation, too. :-)

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

Reply via email to