shared_lock and unique_lock

简单的说:

shared_lock是read lock。被锁后仍允许其他线程执行同样被shared_lock的代码。这是一般做读操作时的需要。

unique_lock是write lock。被锁后不允许其他线程执行被shared_lock或unique_lock的代码。在写操作时,一般用这个,可以同时限制unique_lock的写和share_lock的读。

例子:

void GetFields(DBFields& _return, const std::wstring& sGUID)  {     printf("GetFields\n"); boost::shared_lock< boost::shared_mutex > xLock( GetMutex(sGUID) );

//用shared_lock, 其他线程不可以执行下面的SetFields(), 但可以同时执行GetFields()

_return = GetDataPtr(sGUID)->m_oFieldData.m_oDBFields;   }

void SetFields(const std::wstring& sGUID, const DBFields& aFields) {

printf("SetFields\n"); boost::unique_lock< boost::shared_mutex > xLock(  GetMutex(sGUID) );

//用unique_lock, 其他线程一定要等到这个函数结束才可以执行SetFields()或GetFields()。

GetSetDataPtr(sGUID)->m_oFieldData.m_oDBFields = aFields;   }

转载自http://blog.csdn.net/daraemon418/article/details/7211693

时间: 2024-10-05 03:09:55

shared_lock and unique_lock的相关文章

[C++11 并发编程] 08 - Mutex std::unique_lock

相对于std::lock_guard来说,std::unique_lock更加灵活,std::unique_lock不拥有与其关联的mutex.构造函数的第二个参数可以指定为std::defer_lock,这样表示在构造unique_lock时,传入的mutex保持unlock状态.然后通过调用std::unique_lock对象的lock()方法或者将将std::unique_lock对象传入std::lock()方法来锁定mutex. #include <mutex> class some

c++ unique_lock lock_guard

unique_lock template <class Mutex> class unique_lock; Unique lock A unique lock is an object that manages a mutex object with unique ownership in both states: locked and unlocked. On construction (or by move-assigning to it), the object acquires a m

C++11中lock_guard和unique_lock的区别

c++11中有一个区域锁lock_guard,还有第二个区域锁unique_lock. 区域锁lock_guard使用起来比较简单,除了构造函数外没有其他member function,在整个区域都有效. 区域锁unique_guard除了lock_guard的功能外,提供了更多的member_function,相对来说更灵活一些. unique_guard的最有用的一组函数为: lock locks the associated mutex  (public member function)

c/c++ 多线程 unique_lock的使用

多线程 unique_lock的使用 unique_lock的特点: 1,灵活.可以在创建unique_lock的实例时,不锁,然后手动调用lock_a.lock()函数,或者std::lock(lock_a, -),来上锁.当unique_lock的实例被析构时,会自动调用unlock函数,释放锁. unique_lock<mutex> lock_a(d1.m, std::defer_lock); 2,unique_lock的实例可以调用unlock函数.这个意味着,在unique_lock

C++11之 unique_lock和lock_guard避免死锁

#include <iostream> #include <fstream> #include <thread> #include <mutex> #include <string> using namespace std; class LogFile { public: LogFile() { f.open("log.txt"); } ~LogFile() { } void shared_print(string msg,

C++ 11 thread 基础用法 lock unlock join mutex joinable lock_guard unique_lock condition_variable wait notify_one notify_all asnyc future packaged_task promise

#include "pch.h"#include<iostream> #include<string> #include<vector> #include<list> // 线程相关头文件#include<thread>#include<mutex> #include<future>using namespace std; static int res = 0; //共享变量 演示使用互斥量读写. mu

std::unique_lock与std::lock_guard分析

背景 C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢,导致程序出现未定义或异常行为.通常的做法是在修改共享数据成员时进行加锁(mutex).在使用锁时通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,但经常会出现lock之后离开共享成员操作区域时忘记unlock导致死锁的现象.针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构.通过对lock和unloc

C++11 std::unique_lock与std::lock_guard区别及多线程应用实例

C++11 std::unique_lock与std::lock_guard区别及多线程应用实例 C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁. 针对以上的问题,C++11中引

使用std::lock 和 std::unique_lock来起先swap操作

在上面代码中std::unique_lock可以传进std::lock,因为std::unique_lock有unique_lock提借lock.try_lock.unlock成员函数. std::unique_lock有一个owner_lock函数来判断是否现在已经被锁定.你可以会说使用std::lock_guard可能稍微效率一点.但是std::unique_lock使用可以更灵活,一是可以延迟锁定,二是可以将lock的所有权传送给另一个scope. 原文地址:https://www.cnb