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:
- #pragma comment(lib, "libboost_chrono-vc140-mt-1_60.lib")
- #pragma comment(lib, "libboost_date_time-vc140-mt-1_60.lib")
- #pragma comment(lib, "libboost_system-vc140-mt-1_60.lib")
- #pragma comment(lib, "libboost_system-vc140-mt-1_60.lib")
- #pragma comment(lib, "libboost_thread-vc140-mt-1_60.lib")
boost::shared_mutex用法示例:
参考自:http://*.com/questions/3896717/example-of-how-to-use-boost-upgradeable-mutexes
参考自:http://*.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?
伟大的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的更多相关文章
-
用std::thread替换实现boost::thread_group
thread_group是boost库中的线程池类,内部使用的是boost::thread. 随着C++ 11标准的制定和各大编译器的新版本的推出(其实主要是VS2012的推出啦……),本着能用标准库 ...
-
C++并发编程 02 数据共享
在<C++并发编程实战>这本书中第3章主要将的是多线程之间的数据共享同步问题.在多线程之间需要进行数据同步的主要是条件竞争. 1 std::lock_guard<std::mute ...
-
boost--线程同步
1.互斥锁(互斥量) mutex是独占式的互斥锁.timed_mutex增加了超时功能. 成员函数:lock()用于锁定,try_lock()为非阻塞版本的锁定,unlock()用于解锁.timed_ ...
-
「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 ...
-
boost::interprocess::managed_shared_memory(2)(std::deque)
struct shareDataEx : shareData { int index; int total_size; }; typedef managed_shared_memory::segmen ...
-
Boost scoped_ptr scoped_array 以及scoped_ptr与std::auto_ptr对比
boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <str ...
-
boost muti-thread
背景 • 今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率:为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序: GUI应用程序将那些费时,复杂的处理以线程的形式单独 ...
-
boost::thread 线程锁
1.boost锁的概述: boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁. 2.mutex对象类(主要有两种): 1.boost::mutex(独占互斥类) --& ...
-
(十一)boost库之多线程间通信
(十一)boost库之多线程间通信 1.互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一 ...
随机推荐
-
机器学习利器——Scikit-learn的安装
由于笔者最近在进行毕业论文的准备,且毕业论文中需要用到Python版本的机器学习库——scikit-learn.所以最近三天一直在Windows上部署这个框架,终于部署成功了... 首先打开加州大学底 ...
-
iOS 学习 - 10下载(2) NSURLSession 图片 篇
使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // V ...
-
【WEB】HTTP协议
http1.0和http1.1 区别,http1.1可以发送多个http请求
-
二模 (7) day2
第一题: 题目大意:多重背包. 解题过程: 1.二进制拆分.最慢的点0.5s. 2.单调队列优化会更快,不过我不会.. 第二题: 题目描述:给定一个n×m的矩阵,记录左上角为(1,1),右下角为(n, ...
-
js实现文字字幕滚动
<div class="dggd_r" id="h" style="height:400px;overflow:hidden;display:i ...
-
Trie的C++实现及HDU1251,hdu1671
#include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...
-
Android 原生listview item伸展收缩效果
Android原生listview做的一个item的伸缩效果.*永远不要让你老大有机会改需求 package com.example.yunkanglast; import java.io.Seria ...
-
Map 根据value 排序
总是有特殊的需求 ,呵呵 ,一起看看Map 根据value 排序的一个例子吧,还用到了泛型 很不错 此文仅供自己记录笔记. /** * hashmap 根据值排序 */ public static & ...
-
JavaScript中的ASCII碼轉換成字符的兩種方法
方法一:轉義字符 \xxx:用十六進制的ASCII碼值轉換成字符. 方法二:String方法 String.fromCharCode(value): //用十進制的ASCII碼值轉換成字符. 舉例:結 ...
-
[转帖]无网络离线安装 vs2017
无网络离线安装 vs2017 公司电脑禁止,只有一个老的vs2017的安装目录(之前通过 --layout 安装时生成的离线文件).找了一圈百度,没能解决问题,最后,问bing,查微软的官方网站命令, ...