c++多线程锁机制:读写锁+声明初始化锁语法
2024-10-05 14:24阅读:
#include iostream
#include thread
#include shared_mutex
#include vector
std::shared_mutex rw_mutex; // 互斥锁
int share_data = 0; // 共享数据
void reader() {
std::shared_lock lock(rw_mutex);
std::cout << 'reader thread' <<
std::this_thread::get_id() << '.......readervalues' <<
share_data << std::endl;
}
void writer(int value) {
std::unique_lock lock(rw_mutex);
std::cout << 'writer thread ' <<
std::this_thread::get_id() << '....writervalues' <<
share_data << std::endl;
}
int main() {
std::vector threads;
for (int i = 0; i < 5; ++i)
{
threads.emplace_back(reader);
std::cout << ' 这是 线程 reader
生成 ' << std::endl;
}
for (i
nt i = 0; i < 2; ++i)
{
threads.emplace_back(writer,i);
std::cout << ' 这是 线程 writer
生成 ' << std::endl;
}
for (auto& t : threads)
{
t.join();
}
return 0;
}
————————————————————————————

shared_mutex 两种锁 管理方式 :

1、
std::shared_lock lock(rw_mutex);
std::shared_lock:
是自动锁管理器,
用来管理 std::shared_mutex互斥锁的锁定和解锁。
支持
多读者单写者锁定模式
的 读写锁.
共享访问:当使用 std::shared_lock 时,表明了这个锁管理器(和其它拥有 std::shared_lock
的线程)将共享互斥锁。
这使得多个读操作可以同时进行,没有单一线程独占资源的问题。
互斥与共享的管理:在需要写入或修改被 std::shared_mutex 保护的数据时,可以使用 std::unique_lock
来提供独占访问。
这确保了在执行写操作时不会有其他读操作或写操作干扰。

2、std::unique_lock lock(rw_mutex);
这是一个 unique_lock
锁管理器,互斥锁管理器 。
只可以一个写操作。

3、语法:std::unique_lock lock(rw_mutex); 大聪明认真来一波
是个高级线程同步机制:涉及到了:
模板编程、
互斥锁类型
锁的对象
锁的初始化
1)std::unique_lock
std::unique_lock
是个模板类,提供了对互斥锁(mutex)的管理功能。它封装了一个互斥锁的所有权和生命周期,允许通过构造函数锁定互斥锁,在析构函数中自动释放锁,以及提供了手动锁定和解锁的方法。

是模板参数,指定了 std::unique_lock 将要管理的互斥锁类型。std::shared_mutex
是一个支持多个读取者和单个写入者的互斥锁类型。
2) lock(rw_mutex)
lock 是 std::unique_lock 类型的对象。
对象名为 lock,
这是一个局部变量的名称,通常选择这个名字是因为它清晰地表示了该对象的用途(即锁定某个资源)。
rw_mutex 是传递给 lock 构造函数的参数,它是一个已经定义的 std::shared_mutex 类型的变量。
这个参数指明了 lock 对象将要锁定和管理的具体互斥锁。
3)作用和行为
当 std::unique_lock lock(rw_mutex); 这行代码执行时,lock 对象被创建,并且 rw_mutex
互斥锁被锁定(如果互斥锁已经被其他线程以独占方式锁定,当前线程将会阻塞直到互斥锁可用)。
lock 对象的生命周期控制着 rw_mutex 的锁状态:在 lock 对象生命周期内,rw_mutex 保持锁定状态;当 lock
对象被销毁(如当它的作用域结束时),它的析构函数会自动释放关联的 rw_mutex 互斥锁。