在C++中,读写锁(也称为共享-独占锁或读写互斥量)允许对共享资源的并发访问,其中多个读取者可以同时访问资源,但写入者需要独占访问。C++11标准库提供了std::shared_mutex
和std::shared_lock
来支持读写锁的功能。
以下是一个简单的C++程序,演示了如何使用std::shared_mutex
和std::shared_lock
进行读写锁的试验:
#include <iostream>
#include <thread>
#include <vector>
#include <shared_mutex>
#include <unordered_map>
// 假设我们有一个需要并发访问的共享资源
std::unordered_map<int, std::string> shared_data;
std::shared_mutex mtx; // 读写锁
// 写入函数
void write_data(int key, const std::string& value) {
std::unique_lock<std::shared_mutex> lock(mtx); // 使用unique_lock进行独占锁定
shared_data[key] = value;
std::cout << "Wrote data: " << key << " -> " << value << std::endl;
}
// 读取函数
void read_data(int key) {
std::shared_lock<std::shared_mutex> lock(mtx); // 使用shared_lock进行共享锁定
if (shared_data.find(key) != shared_data.end()) {
std::cout << "Read data: " << key << " -> " << shared_data[key] << std::endl;
} else {
std::cout << "Key " << key << " not found." << std::endl;
}
}
int main() {
// 启动写入线程
std::thread writer(write_data, 1, "Hello");
// 启动多个读取线程
std::vector<std::thread> readers;
for (int i = 0; i < 5; ++i) {
readers.emplace_back(read_data, 1);
}
// 等待所有线程完成
writer.join();
for (auto& t : readers) {
t.join();
}
return 0;
}
注意:
std::unique_lock<std::shared_mutex>
用于独占锁定,即写入操作。在独占锁定期间,其他线程无法获取任何类型的锁(无论是独占锁还是共享锁)。std::shared_lock<std::shared_mutex>
用于共享锁定,即读取操作。在共享锁定期间,其他线程可以获取共享锁(但不能获取独占锁),从而实现多个读取者同时访问资源。- 由于线程调度的不确定性,输出顺序可能会不同。但是,你应该能够观察到写入操作在读取操作之前完成,并且多个读取操作可以同时进行。
- 在实际应用中,你还需要考虑其他并发问题,如死锁、饥饿等,并可能需要使用更复杂的同步原语或策略来管理并发访问。