c++怎么使用std::shared_mutex实现读写锁_c++读写锁shared_mutex用法详解

std::shared_mutex是C++17引入的读写锁机制,允许多个线程共享读锁、单个线程独占写锁,适用于读多写少场景,需包含头文件并启用C++17,推荐使用std::shared_lock和std::unique_lock进行RAII管理以确保异常安全和防止死锁。

c++怎么使用std::shared_mutex实现读写锁_c++读写锁shared_mutex用法详解

std::shared_mutex 是 C++17 引入的一个同步原语,用于实现高效的读写锁机制。它允许多个线程同时进行读操作(共享访问),但在写操作(独占访问)时只允许一个线程执行,并且会阻塞所有其他读和写线程。这种机制非常适合“读多写少”的场景,比如缓存、配置管理等。

1. std::shared_mutex 基本概念

std::shared_mutex 区分两种锁定模式:共享锁(shared lock):多个线程可以同时持有,适用于读操作。 独占锁(exclusive lock):仅一个线程能持有,适用于写操作。当有线程持有共享锁时,新的共享锁可以立即获得;但独占锁必须等待所有共享锁释放后才能获取。

2. 头文件与编译要求

使用 std::shared_mutex 需要包含头文件:

#include

并且编译器需支持 C++17 或更高版本。例如用 g++ 编译时加上:

g++ -std=c++17 your_file.cpp

3. 使用方法示例

下面是一个典型的读写锁使用示例:

#include #include #include #include #include std::vector data = {1, 2, 3};std::shared_mutex shm;  // 共享互斥量// 读操作函数void reader(int id) {    shm.lock_shared();  // 获取共享锁    std::cout << "Reader " << id << " sees data: ";    for (int d : data) {        std::cout << d << " ";    }    std::cout << "n";    std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟处理时间    shm.unlock_shared();  // 释放共享锁}// 写操作函数void writer(int id) {    shm.lock();  // 获取独占锁    std::cout << "Writer " << id << " is writing...n";    data.push_back(id);    std::this_thread::sleep_for(std::chrono::milliseconds(200));    std::cout << "Writer " << id << " finished writing.n";    shm.unlock();  // 释放独占锁}

主函数中启动多个读线程和写线程:

int main() {    std::vector threads;    // 启动 5 个读线程    for (int i = 1; i <= 5; ++i) {        threads.emplace_back(reader, i);    }    // 启动 2 个写线程    for (int i = 10; i <= 11; ++i) {        threads.emplace_back(writer, i);    }    // 启动更多读线程    for (int i = 6; i <= 10; ++i) {        threads.emplace_back(reader, i);    }    // 等待所有线程完成    for (auto& t : threads) {        t.join();    }    return 0;}

输出可能类似(顺序不固定):

Reader 1 sees data: 1 2 3 Reader 2 sees data: 1 2 3 … Writer 10 is writing… Writer 10 finished writing. Reader 6 sees data: 1 2 3 10 …

4. 推荐使用 RAII 管理锁

直接调用 lock/unlock 容易出错,建议使用 RAII 封装类自动管理锁的生命周期:std::shared_lock:用于管理共享锁。 std::unique_lock:也可用于独占锁,但更常用的是直接用 lock_guard 或 unique_lock 配合普通 mutex。不过 shared_mutex 支持 unique_lock 的独占模式。改写上面的函数更安全的方式:

void reader(int id) {    std::shared_lock lock(shm);  // 自动加共享锁,析构时释放    std::cout << "Reader " << id << " sees data: ";    for (int d : data) {        std::cout << d << " ";    }    std::cout << "n";    std::this_thread::sleep_for(std::chrono::milliseconds(100));}  // lock 在这里自动释放void writer(int id) {    std::unique_lock lock(shm);  // 独占锁    std::cout << "Writer " << id << " is writing...n";    data.push_back(id);    std::this_thread::sleep_for(std::chrono::milliseconds(200));    std::cout << "Writer " << id << " finished writing.n";}  // lock 析构时自动释放

这种方式避免了忘记 unlock 导致死锁的风险,也支持异常安全。

5. 注意事项与最佳实践

使用 std::shared_mutex 时注意以下几点:确保读写操作逻辑正确区分:只读用 shared_lock,修改用 unique_lock 或 lock()。 避免长时间持有共享锁,否则会阻塞写线程,造成写饥饿。 某些平台实现中,shared_mutex 性能开销比普通 mutex 高,应根据实际场景选择是否使用。 不能递归加锁:同一个线程重复对 shared_mutex 加共享或独占锁会导致未定义行为。基本上就这些。合理使用 std::shared_mutex 能有效提升多线程程序在读密集场景下的并发性能。

以上就是c++++怎么使用std::shared_mutex实现读写锁_c++读写锁shared_mutex用法详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1481454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++中的enum和enum class有什么区别_传统枚举与强类型枚举的对比分析
上一篇 2025年12月19日 05:30:32
c++怎么在vector中查找一个值_c++查找vector元素的方法
下一篇 2025年12月19日 05:30:39

相关推荐

发表回复

登录后才能评论
关注微信