|
介绍:
C++14中引入std::shared_mutex,用于管理可转移和共享所有权的互斥对象,适合多个线程读取共享资源,且仅一个线程来写这个资源,共享锁这个时候具有性能优势。
用法:使用std::unique_lock(通用互斥包装器)与std::shared_lock(通用共享互斥所有权包装器)管理共享锁定,因为包装器离开作用域析构时会自动释放锁,因此不会造成死锁问题,使用简单明了。
它具有两个访问权限属性:
- 共享性-读属性,多个线程同时共享锁的所有权,需要引入#include <shared_mutex>;
- 独占性-写属性,同一时刻仅一个线程具有所有权的互斥性,需要引入#include <mutex>;
若一个线程已经获得了独占锁,这时其他线程将不能获取该锁(含共享锁)。
示意图:

示例代码片段:
#include <iostream>
#include <mutex>
#include <shared_mutex>
std::shared_mutex test_lock;
int ivalue=0;
void read_fun1(){
// shared_lock共享锁
std::shared_lock<std::shared_mutex> lock(test_lock);
/***do something***/
std::cout << __func__ << ivalue << std::endl;
}
void read_fun2(){
// shared_lock共享锁
std::shared_lock<std::shared_mutex> lock(test_lock);
/***do something***/
std::cout << __func__ << ivalue << std::endl;
}
void write_fun(){
// unique_lock独占锁
std::unique_lock<std::shared_mutex> lock(test_lock);
/***do something***/
ivalue++;
}
当函数read_fun1和read_fun2可以同时进行读取输出ivalue的值,并且write_fun里的锁将阻塞;
当write_fun获得时候锁时候,read_fun1和read_fun2会阻塞;
函数read_fun1、read_fun2、write_fun在执行完后锁会自动释放;
本文由慧拓技术研究院成员分享 |
|