Trey Jackson wrote:
> All,
>
> (Note: I'm not critiquing the design choices, just trying to
> understand the choices and the behavior of the implementation)
>
> I read in the docs that simultaneous reads are ok, but simultaneous
> read/write or write/write are not.  Ok, seems like a valid set up.
>
> When I looked at the implementation, it looks like the reference
> counter uses a mutex when BOOST_HAS_THREADS is defined.
>
> Does that mean that if I have thread capability on my boost
> installation (which I do), I pay for the mutex regardless of whether I
> am actually using threads?

In a word, yes. The actual mutex being used depends on the platform. The
overhead is usually acceptable, even with a plain pthread_mutex.

> Secondly, if I'm paying for the cost of a mutex for the reference
> count, why couldn't the shared_ptr also be protected by a mutex?
>
> Thereby making the simultaneous read/write safe (safe in that no
> memory would be leaked b/c the pointers written/read).

Consider this:

// thread A

p->f();

// thread B

p.reset();

--

p->f(); is equivalent to p.operator->()->f(). To make the above work,
operator-> would need to return a proxy that keeps the mutex locked. Even
so, thread B may get there first.

Even if you do

if(p) p->f();

it is still possible for thread A to evaluate if(p) and thread B to
intervene with a reset.

And of course had this been

(*p).f();

thread B can intervene between *p and the actuall call to f(), since there
is no way to insert a locking proxy in operator*.

In short, there is no way for shared_ptr to reliably synchronize your code
for you. It is only responsible for synchronizing its own code.

> Which brings me to a third question.
> Let's say I've got a class (e.g. shared_count) that I sometimes want
> to be protected by a mutex, and sometimes not.  Say, for instance, I
> want it to be protected by default, but sometimes I want to avoid that
> overhead b/c I know I'll be using it in an environment that's already
> protected by a mutex (and can avoid the extra mutex overhead).

Can you demonstrate this with an example?

> Question: is the following design a reasonable one?
> It appears to work for me.
>
> template<class LockingStrategy>
> class mySuperLockedClass : public LockingStrategy

[...]

Looks OK to me.

> Just wondering if the above strategy could be used in the case of
> shared_count, and if not, why not?

Because of the extra LockingStrategy parameter. :-)

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

Reply via email to