1. mutex/recursive_mutex
最基础的同步工具,需要手动lock/unlock,一般不直接使用,特别对于不可预期的异常情况,可能会导致mutex不能释放
2. std::lock_guard/std::unique_lock/std::scope_lock
lock_guard/unique_lock有些相似,都是在构造中对mutex加锁,析构时释放。不过相对于lock_guard,unique_lock有更多的构造函数重载,所以功能相对强大一些。
先看lock_guard:
std::lock_guard - cppreference.com
lock_guard( mutex_type& m, std::adopt_lock_t t );
lock_guard只有一个重载构造, std::adopt_lock_t,表明lock_guard拥有了mutex的所有权,会再lock_gurad析构时解锁,所以要再构造之前确保mutex在当前线程已经lock。
lock_guard( const lock_guard& ) = dele