C++ std::shared_mutex读写锁的用法(附带实例)
读写锁也称为共享-独占锁或者 RWLock,在 C++ 中可以通过 std::shared_mutex 来实现,这种锁在 C++17 标准中被引入。
读写锁允许多个读操作同时进行,但写操作是互斥的,即任何时候只允许一个线程执行写操作,并且在执行写操作时不能有读操作或其他写操作。
读写锁的主要优势在于提高并发性,尤其在读操作远多于写操作的情况下。
以下是一个使用 std::shared_mutex 的示例,展示如何实现多个线程可以同时读取数据,但只有一个线程可以写入数据的情况。
读写锁允许多个读操作同时进行,但写操作是互斥的,即任何时候只允许一个线程执行写操作,并且在执行写操作时不能有读操作或其他写操作。
读写锁的主要优势在于提高并发性,尤其在读操作远多于写操作的情况下。
以下是一个使用 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++ 提供了现代和安全的方式来使用读写锁,简化了复杂并发环境下的编程工作。