std::shared_mutex用于管理可转移和共享所有权的互斥对象,适用场景比较特殊:一个或多个读线程同时读取共享资源,且只有一个写线程来修改这个资源,这种情况下才能从shared_mutex获取性能优势(Shared mutexes are usually used in situations when multiple readers can access the same resource at the same time without causing data races, but only one writer can do so.)
std::unique_lock和std::lock_guard的选择问题,这个回答写的很好:
unique_lock比lock_guard要灵活
lock_guard锁定后不能释放,mutex是一直锁定的,而unique_lock可以释放。
unique_lock手动加锁解锁例子参考此处
std::mutex m_mutex; void print(int cnt) { //用unique_lock来对锁进行管理.defer_lock是它的构造参数之一.用来推迟加锁. unique_lock<mutex> lock(m_mutex, defer_lock); /* ...这里可以进行一系列线程安全的操作... */ //手动加锁. lock.lock(); cout << std::this_thread::get_id() << " " << cnt << endl; lock.unlock(); //这里用来计算sum的值.然后打印.因为sum是在函数内定义的局部变量.所以下面的代码是线程安全的.没必要用锁对这段代码进行保护.所以在上面用unlock解锁. int sum = 0; for (int i = 0; i < cnt; ++i) { sum += i; } //最后在手动加锁.不用手动释放.因为会在生命周期结束时自动释放. lock.lock(); cout << std::this_thread::get_id() << " " << sum << endl; }
而条件变量中的一些过程是需要释放锁的,所以在使用条件变量的时候,要用unique_lock而不是使用lock_guard。
搭配方式:
typedef std::shared_lock<std::shared_mutex> ReadLock; typedef std::lock_guard<std::shared_mutex> WriteLock;
参考链接:https://www.jianshu.com/p/86abf93a05e7/
https://blog.csdn.net/lv0918_qian/article/details/81745723