Mutex Types and Locking Methods
This lesson discusses different types of mutexes and their locking methods
We'll cover the following
C++ has five different mutexes that can lock recursively (i.e., multiple layers of locking), tentative with and without time constraints.
Method | mutex | recursive_mutex | timed_mutex | recursive_timed_mutex | shared_timed_mutex |
---|---|---|---|---|---|
m.lock |
yes | yes | yes | yes | yes |
m.unlock |
yes | yes | yes | yes | yes |
m.try_lock |
yes | yes | yes | yes | yes |
m.try_lock_for |
no | no | yes | yes | yes |
m.try_lock_until |
no | no | yes | yes | yes |
m.try_lock_shared |
no | no | no | no | yes |
m.try_lock_shared_for |
no | no | no | no | yes |
m.try_lock_shared_until |
no | no | no | no | yes |
std:shared_timed_mutex
With C++14 we have an std::shared_timed_mutex
that is the base for reader-writer locks. It solves the infamous reader-writer problem.
The std::shared_timed_mutex
enables you to implement reader-writer locks which means that you can use it for exclusive or shared locking. You will get an exclusive lock if you put the std::shared_timed_mutex
into a std::lock_guard
; you will get a shared lock if you put it into an std::shared_lock
.
std::shared_mutex
with C++17With C++17 we get a new mutex:
std::shared_mutex
.std::shared_mutex
is similar tostd::shared_timed_mutex
. Like thestd::shared_timed_mutex
, you can use it for exclusive or shared locking, but you can not specify a time point or a time duration.
Mutex try_lock
methods
The m.try_lock_for(relTime)
(m.try_lock_shared_for(relTime)
) method needs a relative time duration; the m.try_lock_until(absTime)
(m.try_lock_shared_until(absTime)
) method needs an absolute time point.
m.try_lock
(m.try_lock_shared
) tries to lock the mutex and returns immediately. On success, it returns true; otherwise, it’s false. In contrast, the methods try_lock_for
(try_lock_shared_for
) and try_lock_until
(try_lock_shared_until
) try to lock until the specified timeout occurs or the lock is acquired, whichever comes first. You should use a steady clock for your time constraint. A steady clock cannot be adjusted.
Tip: You should not use mutexes directly; you should put mutexes into locks.
Get hands-on with 1400+ tech skills courses.