BDE 4.14.0 Production release
|
Provide a multi-reader/single-writer lock.
This component defines an efficient multi-reader/single-writer lock mechanism, bslmt::ReaderWriterMutex
. It is designed to allow concurrent read access to a shared resource while still controlling write access.
Reader-writer locks are generally used for resources that are frequently read and less frequently updated. Unlike other lock mechanisms (e.g., "mutexes"), reader-writer locks provide two distinct but mutually exclusive lock states: a read lock state, and a write lock state.
To the extent the implementation's underlying mutex prevents a thread from starving, readers can not be starved by writers and writers can not be starved by readers. If the underlying mutex, to some extent, favors re-acquisition of the mutex to allowing a new thread to obtain the mutex (e.g., the mutex obtained on Linux), this reader-writer lock is writer biased since writers can re-acquire the lock in the presence of readers but readers will not be able to re-acquire the lock in the presence of writers.
bslmt::ReaderWriterMutex
(defined in this component). Preferred for most use-cases, has been shown to be faster than bslmt::ReaderWriterLock
under most conditions and is generally the best choice.bslmt::ReaderWriterLock
: Preferred only when very long hold times are anticipated. It also provides upgrade*
methods from a locked-for-read state to a locked-for-write state, but the use of this feature is discouraged as it has performed poorly on benchmarks.bslmt::RWMutex
: Deprecated.Note that for extremely short hold times and very high concurrency, a bslmt::Mutex
might outperform all of the above.
This section illustrates intended use of this component.
The following snippets of code illustrate the use of bslmt::ReaderWriterMutex
to write a thread-safe class, my_Account
. Note the typical use of mutable
for the lock:
Where appropriate, clients should use a lock-guard to ensure that an acquired mutex is always properly released, even if an exception is thrown.
The atomic my_Account
methods are used as expected: