A PPL-compatible reader-writer mutex that is scalable and gives preference to writers.
class reader_writer_lock;
#include "tbb/reader_writer_lock.h"
A reader_writer_lock implements a PPL-compatible reader-writer mutex. A reader_writer_lock is scalable and nonrecursive. The implementation handles lock requests on a first-come first-serve basis except that writers have preference over readers. Waiting threads busy wait, which can degrade system performance if the wait is long. However, if the wait is typically short, a reader_writer_lock can provide performance competitive with other mutexes.
A reader_writer_lock models part of the ReaderWriterMutex Concept and part of the C++11 compatibility interface. The major differences are:
The scoped interfaces support only strictly scoped locks. For example, the method scoped_lock::release() is not supported.
Reader locking has a separate interface. For example, there is separate scoped interface scoped_lock_read for reader locking, instead of a flag to distinguish the reader cases as in the ReaderWriterMutex Concept.
namespace tbb {
class reader_writer_lock {
public:
reader_writer_lock();
~reader_writer_lock();
void lock();
void lock_read();
bool try_lock();
bool try_lock_read();
void unlock();
class scoped_lock {
public:
scoped_lock( reader_writer_lock& mutex );
~scoped_lock();
};
class scoped_lock_read {
public:
scoped_lock_read( reader_writer_lock& mutex );
~scoped_lock_read();
};
};}
The following table summarizes the semantics.
|
Member |
Semantics |
|---|---|
|
reader_writer_lock() |
Construct unlocked mutex. |
| ~reader_writer_lock() |
Destroy unlocked mutex. |
|
void reader_writer_lock::lock() |
Acquire write lock on mutex. |
|
void reader_writer_lock::lock_read() |
Acquire read lock on mutex. |
|
bool reader_writer_lock::try_lock() |
Try to acquire write lock on mutex. Returns true if lock acquired, false otherwise. |
|
bool reader_writer_lock::try_lock_read() |
Try to acquire read lock on mutex. Returns true if lock acquired, false otherwise. |
|
reader_writer_lock::unlock() |
Release lock. |
| reader_writer_lock::scoped_lock (reader_writer_lock& m) |
Acquire write lock on mutex m. |
|
reader_writer_lock::~scoped_lock() |
Release write lock (if acquired). |
reader_writer_lock::scoped_lock_read (reader_writer_lock& m) |
Acquire read lock on mutex m. |
|
reader_writer_lock::~scoped_lock_read() |
Release read lock (if acquired). |