$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Hamish Mackenzie (hamish_at_[hidden])
Date: 2003-02-06 09:01:56
On Wed, 2003-02-05 at 18:09, Trey Jackson wrote:
> template<class LockingStrategy>
> class mySuperLockedClass : public LockingStrategy
> {
> public:
>   void read() 
>   {
>     LockingStrategy::readlock();
>     // do stuff
>   }
>   void write() 
>   {
>     LockingStrategy::writelock();
>     // do stuff
>   }
> };
> 
...
> struct
> MutexLockingStrategy 
> {
>   boost::mutex m_;
>   void readlock() 
>   {
>     boost::mutex::scoped_lock l(m_);
>   }
>   void writelock() 
>   {
>     boost::mutex::scoped_lock l(m_);
>   }
> };
> 
These scoped locks will go out of scope before you "do stuff".
You can extend the scope using something like...
template<class LockingStrategy>
class mySuperLockedClass : public LockingStrategy
{
public:
  void read() 
  {
    typename LockingStrategy::read_lock_type l( this );
    // do stuff
  }
  void write() 
  {
    typename LockingStrategy::write_lock_type l( this );
    // do stuff
  }
};
struct
MutexLockingStrategy 
{
  boost::mutex m_;
  class read_lock_type 
  {
  public:
    readlock_type( MutexLockingStrategy * s ) : l_( s->m_ )
  private:
    boost::mutex::scoped_lock l_;
  }
  class write_lock_type 
  {
  public:
    writelock_type( MutexLockingStrategy * s ) : l_( s->m_ )
  private:
    boost::mutex::scoped_lock l_;
  }
};
// etc.
-- Hamish Mackenzie <hamish_at_[hidden]>