The std::mutex is a non-recursive mutex and therefore can’t be locked again from the same thread before getting unlocked. This can lead quite fast to a deadlock. That’s the point where std::recursive_mutex comes in place. It can be locked multiple time from the same threat without the need to unlock it first.
Example – With deadlock
#include <iostream> #include <thread> #include <mutex> class Cache { public: Cache() : m_Mtx(), m_Val(0) {} bool update(int val) { std::lock_guard<std::mutex> lock(m_Mtx); bool updated = false; if (m_Val != val) { write(val); updated = true; std::cout << "val has been updated" << std::endl; } return updated; } private: void write(int val) { std::lock_guard<std::mutex> lock(m_Mtx); // 2nd lock --> deadlock m_Val = val; } std::mutex m_Mtx; int m_Val; }; int main() { Cache cache; std::thread t(&Cache::update, &cache, 42); t.join(); return 0; }