C++14中引入std::shared_mutex

说明

C++14中引入std::shared_mutex
std::shared_mutex用于管理可转移和共享所有权的互斥对象,适用场景比较特殊:一个或多个读线程同时读取共享资源,且只有一个写线程来修改这个资源,这种情况下才能从shared_mutex获取性能优势。

  • shared_lock是read lock。搭配std::shared_mutex使用,被锁后仍允许其他线程执行同样被shared_lock的代码。
//shared_lock构造函数中调用了shared_mutex的lock_shared函数explicit shared_lock(mutex_type& _Mtx): _Pmtx(_STD addressof(_Mtx)), _Owns(true) { // construct with mutex and lock shared_Mtx.lock_shared();}
  • lock_guard和unique_lock是write lock。被锁后不允许其他线程执行被shared_lock或unique_lock的代码。
//lock_guard以及unique_lock构造函数中调用了shared_mutex的lock函数explicit lock_guard(_Mutex& _Mtx) : _MyMutex(_Mtx) { // construct and lock_MyMutex.lock();}
//unique_lockexplicit unique_lock(_Mutex& _Mtx) : _Pmtx(_STD addressof(_Mtx)), _Owns(false) { // construct and lock_Pmtx->lock();_Owns = true;}
  • std::shared_mutex 相比于mutex多提供了一个lock_shared函数,用于读锁。

测试

#include 
#define READ_THREAD_COUNT 8  
#define LOOP_COUNT 5000000  
class TimeConsum
{
public:TimeConsum() { m_nTimeStart = std::chrono::high_resolution_clock::now(); };operator double&& () const noexcept{auto end = std::chrono::high_resolution_clock::now();return std::chrono::duration_cast>(end - m_nTimeStart).count();}private:std::chrono::high_resolution_clock::time_point m_nTimeStart;
};using  ReadLock	= std::shared_lock ;
using  WriteLock = std::lock_guard  ;
using  NormalLock = std::lock_guard;class SharedMutexCounter 
{
public:SharedMutexCounter() = default;unsigned int get() const {//被mutable修饰的变量即使在const函数中也可以修改ReadLock lock(mutex);return value;}void increment() {WriteLock lock(mutex);value++;}std::string name()const{return "shared";}private://在C++中,mutable也是为了突破const的限制而设置的。//被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。mutable std::shared_mutex mutex;unsigned int value = 0;
};class MutexCounter 
{
public:MutexCounter() = default;unsigned int get() const {NormalLock lock(mutex);return value;}void increment() {NormalLock lock(mutex);value++;}std::string name()const{return "normal";}private:mutable std::mutex mutex;unsigned int value = 0;
};template 
void test_mutex()
{TimeConsum cons;std::atomic_int32_t temp{ 0 };COUNTER counter;const auto writer = [&counter]() {for (int i = 0; i < LOOP_COUNT; ++i)counter.increment(); };const auto reader = [&counter, &temp]() {for (int i = 0; i < LOOP_COUNT; ++i)temp = counter.get(); };std::vectorreadlist;for (int i = 0; i < READ_THREAD_COUNT; ++i){readlist.emplace_back(reader);}thread wr(writer);for (int i = 0; i < readlist.size(); ++i){readlist[i].join();}wr.join();std::cout << "Test "<< counter.name()<<", count:[" << counter.get() << "]" << ",get:[" << temp << "]" << std::endl;std::cout << "Const time:[" << cons << "]" << std::endl;
}void shared_lock_test()
{test_mutex();test_mutex();
}//output
Test normal, count:[5000000],get:[5000000]
Const time:[3821.9]
Test shared, count:[5000000],get:[5000000]
Const time:[2274.59]


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部