$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Phil Endecott (spam_from_boost_dev_at_[hidden])
Date: 2008-05-09 13:06:37
vicente.botet wrote:
> template <typename Lockable>
> class shared_lockable_adapter
> {
>     shared_lockable_adapter(Lockable& mtx): mtx_(mtx) {}
>     ~shared_lockable_adapter() {}
>     void lock_shared() {mtx_.lock();}
>     void unlock_shared() {mtx_.unlock();}
>     bool try_lock_shared() { return mtx_.try_lock();}
>     void lock() {mtx_.lock();}
>     void unlock() {mtx_.unlock();}
>     bool try_lock() { return mtx_.try_lock();}
>     // other functions ....
> private:
>     Lockable& mtx_;
> };
So this is a trivial adapter that makes a shared mutex that can't 
actually be shared.
It would also be possible, I think, to make an adapter that actually 
creates a shared mutex from a normal one.  I've never had to write a 
read/write mutex but I guess that this is how they are implemented internally.
There are various usage scenarios.  For example, I may have a generic 
algorithm that really needs a shared lock that can be shared, i.e. it 
creates threads that must run concurrently.  If I concept-check that 
the passed mutex is a SharedLockable, but it's actually your adaptor, 
I'll get a runtime deadlock.  Maybe we need some more fine-grained 
concepts to express these requirements.
Certainly it would help if algorithms could work with both shared and 
non-shared mutexes without extra effort.  I'm not yet aware of much 
generic code that uses mutexes and lock concepts.  No doubt we will 
learn more as that code appears.
Phil.