Boost logo

Boost :

From: Howard Hinnant (hinnant_at_[hidden])
Date: 2003-07-13 18:04:57


I'm not positive if a read/write lock is being contemplated for a
future boost::threads version or not. But I was stumbling through
thread_dev and came upon a rw_mutex which might be used something like:

class A
{
public:
     ...
     void read() const
     {
         boost::rw_mutex::scoped_rw_lock lock(mut_);
         ...
     }

     void write()
     {
         boost::rw_mutex::scoped_rw_lock lock(mut_, boost::EXCL_LOCK);
         ...
     }
     ...
private:
     ...
     mutable boost::rw_mutex mut_;
};

And if you needed to "manually" lock the scoped_rw_lock, it would look
like:

lock.rdlock();

or

lock.wrlock();

Unlocking a scoped_rw_lock follows the more familiar:

lock.unlock();

which then figures out at run time whether it is unlocking a reader or
a writer.

Ok, enough of the review. Assuming that rw_lock is destined for
release, I propose that whether you want to lock for reading, or for
writing, is usually a decision made at compile time, and that this fact
can be made to slightly simplify the scoped_lock interface, and make it
slightly more efficient. So as a minor twist to the interface, I
propose:

class rw_mutex
{
public:
             typedef detail::read_lock<rw_mutex> read_lock;
        typedef detail::write_lock<rw_mutex> write_lock;
      ...
};

I'm not picky about the names read_lock and write_lock. Then these
locks could have the "standard" scoped_lock interface. So the "A"
example above would look more like:

class A
{
public:
     ...
     void read() const
     {
         boost::rw_mutex::read_lock lock(mut_);
         ...
     }

     void write()
     {
         boost::rw_mutex::write_lock lock(mut_);
         ...
     }
     ...
private:
     ...
     mutable boost::rw_mutex mut_;
};

And if you needed to lock these manually, then you could say:

lock.lock();

instead of

lock.rdlock() or lock.wrlock();

This looks slightly more readable and writable to me. And will avoid
unlock() having to check what kind of lock (read or write) it is trying
to unlock.

-Howard


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk