C++17 std::shared_mutex的替代方案boost::shared_mutex

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:

Cpp代码  收藏代码
  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

Cpp代码  收藏代码
复制代码
#include <boost/thread/locks.hpp>    
#include <boost/thread/shared_mutex.hpp>    
  
int  
main()  
{  
    typedef boost::shared_mutex Mutex;  
    typedef boost::shared_lock<Mutex> ReadLock;  
    typedef boost::unique_lock<Mutex> WriteLock;  
    Mutex mutex;  
  
    {  
        // acquire read lock  
        ReadLock read( mutex );  
  
        // do something to read resource  
    }  
  
    {  
        // acquire write lock  
        WriteLock write( mutex, boost::adopt_lock_t() );  
  
        // do something to write resource  
    }  
}  
复制代码

 

 

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

Cpp代码  收藏代码
复制代码
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实现读写锁

伟大的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 = 1;
 
//线程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 = 2;
}
复制代码

 


通过 shared_lock 为 shared_mutex 上锁之后,线程将获得其共享锁,此时其他线程仍可以获得共享锁来读取 data,但是此时 unique_lock 将无法为 shared_mutex 上独占锁,功能1实现了。通过 unique_lock 为 shared_lock 上锁之后,线程将获得独占锁,此时无法再被上锁,功能2页实现了。
posted @   南哥的天下  阅读(3293)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2014-12-15 解决TIME_WAIT过多造成的问题
2014-12-15 分布式和集群的概念和区别
2014-12-15 理解Queue队列中join()与task_done()的关系
2014-12-15 源码解读:Flask上下文与代理模式
点击右上角即可分享
微信分享提示