C++17 std::shared_mutex(读写锁机制)(提高并发)

std::shared_mutex(读写锁机制)

std::shared_mutex是C++17标准库中新增的一个类,它提供了读写锁机制,可以同时支持多个线程对同一个资源进行读操作,但只能支持一个线程对同一个资源进行写操作。这样可以避免多个线程同时写同一个资源而导致的数据竞争问题,提高程序的并发性能。

示例

下面是一个简单的例子,演示了如何使用std::shared_mutex来实现读写锁机制:

#include <iostream>
#include <thread>
#include <shared_mutex>

std::shared_mutex mtx; // 创建一个读写锁对象
int count = 0; // 共享资源

void read() {
    std::shared_lock<std::shared_mutex> lock(mtx); // 创建一个读锁保护对象,自动加读锁
    std::cout << "count = " << count << std::endl; // 读取共享资源
} // 读锁保护对象被销毁时,自动解读锁

void write() {
    std::unique_lock<std::shared_mutex> lock(mtx); // 创建一个写锁保护对象,自动加写锁
    ++count; // 修改共享资源
} // 写锁保护对象被销毁时,自动解写锁

int main() {
    std::thread t1(read);
    std::thread t2(read);
    std::thread t3(write);
    t1.join();
    t2.join();
    t3.join();
    return 0;
}

在上面的例子中,我们创建了一个读写锁对象mtx,并定义了一个共享资源count。在read函数中,我们创建了一个读锁保护对象lock,它会自动加读锁,然后读取共享资源count。在read函数返回时,读锁保护对象lock会自动解读锁。在write函数中,我们创建了一个写锁保护对象lock,它会自动加写锁,然后修改共享资源count。在write函数返回时,写锁保护对象lock会自动解写锁。在main函数中,我们创建了三个线程t1t2t3,它们分别调用read函数和write函数来读取和修改共享资源count。可以看到,两个读线程可以同时读取共享资源,而写线程必须等待读线程结束后才能修改共享资源,这样可以避免多个线程同时写同一个资源而导致的数据竞争问题。

std::mutexstd::shared_mutex都是C++标准库中提供的线程安全机制,它们的主要区别在于锁的类型和使用场景。

std::shared_mutexstd::mutex区别

std::mutex是一种互斥锁,它只支持独占访问,即同一时间只能有一个线程访问被保护的资源。如果多个线程同时访问被保护的资源,其中一个线程会获得锁,其他线程会被阻塞,直到获得锁的线程释放锁。std::mutex适用于对共享资源进行独占访问的场景,例如生产者消费者模型中的缓冲区。

std::shared_mutex是一种读写锁,它支持共享访问和独占访问。多个线程可以同时读取被保护的资源,但只能有一个线程进行写操作。如果一个线程正在进行写操作,其他线程无法进行读操作或写操作,直到写操作完成。std::shared_mutex适用于对共享资源进行读写操作的场景,例如数据库中的读写操作。

总的来说,std::mutex适用于对共享资源进行独占访问的场景,而std::shared_mutex适用于对共享资源进行读写操作的场景。如果你需要对共享资源进行独占访问,可以使用std::mutex,如果你需要对共享资源进行读写操作,可以使用std::shared_mutex

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dontla

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值