|
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: