Example for boost shared_mutex (multiple reads/one write)?
1800 INFORMATION is more or less correct, but there are a few issues I wanted to correct.
boost::shared_mutex _access;void reader(){ boost::shared_lock< boost::shared_mutex > lock(_access); // do work here, without anyone having exclusive access}void conditional_writer(){ boost::upgrade_lock< boost::shared_mutex > lock(_access); // do work here, without anyone having exclusive access if (something) { boost::upgrade_to_unique_lock< boost::shared_mutex > uniqueLock(lock); // do work here, but now you have exclusive access } // do more work here, without anyone having exclusive access}void unconditional_writer(){ boost::unique_lock< boost::shared_mutex > lock(_access); // do work here, with exclusive access}
Also Note, unlike a shared_lock, only a single thread can acquire an upgrade_lock at one time, even when it isn't upgraded (which I thought was awkward when I ran into it). So, if all your readers are conditional writers, you need to find another solution.
It looks like you would do something like this:
boost::shared_mutex _access;void reader(){ // get shared access boost::shared_lock<boost::shared_mutex> lock(_access); // now we have shared access}void writer(){ // get upgradable access boost::upgrade_lock<boost::shared_mutex> lock(_access); // get exclusive access boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock); // now we have exclusive access}
Since C++ 17 (VS2015) you can use the standard for read-write locks:
#include <shared_mutex>typedef std::shared_mutex Lock;typedef std::unique_lock< Lock > WriteLock;typedef std::shared_lock< Lock > ReadLock;Lock myLock;void ReadFunction(){ ReadLock r_lock(myLock); //Do reader stuff}void WriteFunction(){ WriteLock w_lock(myLock); //Do writer stuff}
For older version, you can use boost with the same syntax:
#include <boost/thread/locks.hpp>#include <boost/thread/shared_mutex.hpp>typedef boost::shared_mutex Lock;typedef boost::unique_lock< Lock > WriteLock;typedef boost::shared_lock< Lock > ReadLock;