首页 > 编程笔记 > C++笔记 阅读:17

C++ std::shared_mutex读写锁的用法(附带实例)

读写锁也称为共享-独占锁或者 RWLock,在 C++ 中可以通过 std::shared_mutex 来实现,这种锁在 C++17 标准中被引入。

读写锁允许多个读操作同时进行,但写操作是互斥的,即任何时候只允许一个线程执行写操作,并且在执行写操作时不能有读操作或其他写操作。

读写锁的主要优势在于提高并发性,尤其在读操作远多于写操作的情况下。

以下是一个使用 std::shared_mutex 的示例,展示如何实现多个线程可以同时读取数据,但只有一个线程可以写入数据的情况。
#include <iostream>
#include <shared_mutex>
#include <thread>
#include <vector>

std::shared_mutex rwMutex;
int data = 0;

void reader(int id) {
    for (int i = 0; i < 5; ++i) {
        rwMutex.lock_shared();  // 获取共享锁
        std::cout << "Reader " << id << " reads " << data << '\n';
        rwMutex.unlock_shared();  // 释放共享锁
        std::this_thread::sleep_for(std::chrono::milliseconds(100));  // 模拟读取所需时间
    }
}

void writer(int id) {
    for (int i = 0; i < 5; ++i) {
        rwMutex.lock();  // 获取独占锁
        data += id;
        std::cout << "Writer " << id << " writes " << data << '\n';
        rwMutex.unlock();  // 释放独占锁
        std::this_thread::sleep_for(std::chrono::milliseconds(100));  // 模拟写入所需时间
    }
}

int main() {
    std::thread w(writer, 10), r1(reader, 1), r2(reader, 2);
    w.join();
    r1.join();
    r2.join();
    return 0;
}
在这个例子中,使用 std::shared_mutex 允许多个读者同时读取数据,但只允许一个写者独占访问。读者调用 lock_shared() 方法来获取共享锁,写者调用 lock() 方法来获取独占锁。

使用std::shared_lock进行优化

为了简化锁的管理并自动处理锁的释放,C++17 同时引入了 std::shared_lock,它对于共享锁的使用与 std::lock_guard 或 std::unique_lock 类似,可以自动管理读锁的获取和释放。
void reader(int id) {
    for (int i = 0; i < 5; ++i) {
        std::shared_lock<std::shared_mutex> lock(rwMutex);  // 自动获取和释放共享锁
        std::cout << "Reader " << id << " reads " << data << '\n';
        std::this_thread::sleep_for(std::chrono::milliseconds(100));  // 模拟读取所需时间
    }
}
读写锁非常适合读多写少的应用场景,可以有效地提高程序的并行性和性能。通过 std::shared_mutex 和相关的工具类(如 std::shared_lock),C++ 提供了现代和安全的方式来使用读写锁,简化了复杂并发环境下的编程工作。

相关文章