[CP.50: Define a mutex together with the data it guards. Use synchronized_value where possible](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rconc-mutex)
0.4.8 Mutexes locked with std::lock or std::try_lock shall be wrapped with std::lock_guard, std::unique_lock or std::shared_lock with adopt_lock tag within the same scope.
0.4.4 Do not destroy objects of the following types std::mutex , std::timed_mutex , std::recursive_mutex , std::recursive_timed_mutex , std::shared_mutex , std::shared_timed_mutex if object is in locked or shared locked state
0.4.11 There shall be no code path which results in locking of the non-recursive mutex within the scope when this mutex is already locked
0.4.12 The order of nested locks unlock shall form a directed acyclic graph