std::shared_mutex

http://en.cppreference.com/w/cpp/thread/shared_mutex

GCC5.1才会支持C++17 std::shared_mutex,替代方案是boost::shared_mutex

boost::shared_mutex官方文档:http://www.boost.org/doc/libs/1_60_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.shared_mutex

需要的lib:

  1. #pragma comment(lib, "libboost_chrono-vc140-mt-1_60.lib")
  2. #pragma comment(lib, "libboost_date_time-vc140-mt-1_60.lib")
  3. #pragma comment(lib, "libboost_system-vc140-mt-1_60.lib")
  4. #pragma comment(lib, "libboost_system-vc140-mt-1_60.lib")
  5. #pragma comment(lib, "libboost_thread-vc140-mt-1_60.lib")

boost::shared_mutex用法示例:

参考自:http://stackoverflow.com/questions/3896717/example-of-how-to-use-boost-upgradeable-mutexes

参考自:http://stackoverflow.com/questions/989795/example-for-boost-shared-mutex-multiple-reads-one-write

boost::shared_mutex _access;
void reader()
{
// get shared access
boost::shared_lock<boost::shared_mutex> lock(_access); // now we have shared access
} void writer()
{
// get upgradable access
boost::upgrade_lock<boost::shared_mutex> lock(_access); // get exclusive access
boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
// now we have exclusive access
}

其他参考:

How to make a multiple-read/single-write lock from more basic synchronization primitives?

http://stackoverflow.com/questions/27860685/how-to-make-a-multiple-read-single-write-lock-from-more-basic-synchronization-pr

伟大的Boost库给我们提供了 shared_mutex  类,结合 unique_lock 与 shared_lock 的使用,可以实现读写锁。

通常读写锁需要完成以下功能:

1.当 data 被线程A读取时,其他线程仍可以进行读取却不能写入

2.当 data 被线程A写入时,其他线程既不能读取也不能写入

对应于功能1,2我们可以这样来描述:

1.当线程A获得共享锁时,其他线程仍可以获得共享锁但不能获得独占锁

2.当线程A获得独占锁时,其他线程既不能获得共享锁也不能获得独占锁

typedef boost::shared_lock<boost::shared_mutex> read_lock;
typedef boost::unique_lock<boost::shared_mutex> write_lock; boost::shared_mutex read_write_mutex;
int32_t data = ; //线程A,读data
{
read_lock rlock(read_write_mutex);
std::cout << data << std:; endl;
} //线程B,读data
{
read_lock rlock(read_write_mutex);
std::cout << data << std:; endl;
} //线程C,写data
{
write_lock rlock(read_write_mutex);
data = ;
}

通过 shared_lock 为 shared_mutex 上锁之后,线程将获得其共享锁,此时其他线程仍可以获得共享锁来读取 data,但是此时 unique_lock 将无法为 shared_mutex 上独占锁,功能1实现了。通过 unique_lock 为 shared_lock 上锁之后,线程将获得独占锁,此时无法再被上锁,功能2页实现了。

C++17 std::shared_mutex的替代方案boost::shared_mutex的更多相关文章

  1. 用std::thread替换实现boost::thread_group

    thread_group是boost库中的线程池类,内部使用的是boost::thread. 随着C++ 11标准的制定和各大编译器的新版本的推出(其实主要是VS2012的推出啦……),本着能用标准库 ...

  2. C++并发编程 02 数据共享

    在<C++并发编程实战>这本书中第3章主要将的是多线程之间的数据共享同步问题.在多线程之间需要进行数据同步的主要是条件竞争. 1  std::lock_guard<std::mute ...

  3. boost--线程同步

    1.互斥锁(互斥量) mutex是独占式的互斥锁.timed_mutex增加了超时功能. 成员函数:lock()用于锁定,try_lock()为非阻塞版本的锁定,unlock()用于解锁.timed_ ...

  4. 「caffe编译bug」 undefined reference to `boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11

    CXX/LD -o .build_release/tools/test_net.binCXX/LD -o .build_release/tools/convert_annoset.binCXX/LD ...

  5. boost::interprocess::managed_shared_memory(2)(std::deque)

    struct shareDataEx : shareData { int index; int total_size; }; typedef managed_shared_memory::segmen ...

  6. Boost scoped_ptr scoped_array 以及scoped_ptr与std::auto_ptr对比

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <str ...

  7. boost muti-thread

    背景 •       今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率:为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序: GUI应用程序将那些费时,复杂的处理以线程的形式单独 ...

  8. boost::thread 线程锁

    1.boost锁的概述: boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁. 2.mutex对象类(主要有两种): 1.boost::mutex(独占互斥类) --& ...

  9. (十一)boost库之多线程间通信

    (十一)boost库之多线程间通信 1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一 ...

随机推荐

  1. linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  2. LGOJP2831 愤怒的小鸟

    题目链接 题目链接 题解 数据范围显然状压/爆搜. 考虑\(f[S]\)表示二进制下已打了的猪的集合. 可以枚举\(S\)的子集\(S_1\),判定\(S\)中\(S_1\)的补集\(S_2\)是否合 ...

  3. quiver()函数

    1.quiver函数 一般用于绘制二维矢量场图,函数调用方法如下: 1 quiver(x,y,u,v) 该函数展示了点(x,y)对应的的矢量(u,v).其中,x的长度要求等于u.v的列数,y的长度要求 ...

  4. 使用unsafe改善性能

    这种方式是Go所推荐的,优点就是安全,尽管这种操作会发生内存拷贝,导致性能上会有所损耗,这在处理一般业务时这种损耗是可以忽略的.但如果是拷贝频繁的情况下,想要进行性能优化时,就需要引入unsafe.P ...

  5. 如何轻松愉快地理解条件随机场(CRF)

    https://blog.csdn.net/DCX_abc/article/details/78319246 机器学习之条件随机场(CRF): https://blog.csdn.net/wangya ...

  6. BZOJ 2159: Crash 的文明世界 第二类斯特林数+树形dp

    这个题非常巧妙啊~ #include <bits/stdc++.h> #define M 170 #define N 50003 #define mod 10007 #define LL ...

  7. C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

    #include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...

  8. 机器学习实战(1)- KNN

    KNN:k近邻算法-在训练样本中找到与待测样本距离相近的N个样本,并用这N个样本中所属概率最大的类别作为待测样本的类别. 算法步骤: 1.对训练中的样本数据的不同属性进行归一化处理. 2.计算待测样本 ...

  9. 请解释或描述一下Django的架构

    对于Django框架遵循MVC设计,并且有一个专有名词:MVT M全拼为Model,与MVC中的M功能相同,负责数据处理,内嵌了ORM框架 V全拼为View,与MVC中的C功能相同,接收HttpReq ...

  10. 【洛谷】P3188 [HNOI2007]梦幻岛宝珠

    题目描述 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.  数据范围:N<=100;W<=2^30,并且保证每 ...