线程同步之读写锁--shared_mutex
在C++11及之后的版本中,我们可以使用std::shared_mutex和相关的读写锁机制来同步对共享资源的访问。这里我会提供一个基本的例子,展示如何使用std::shared_mutex、std::shared_lock和std::unique_lock来实现读写锁的功能。
首先,我们定义一个包含共享资源的类,以及使用std::shared_mutex来保护该资源的访问:
#include <iostream>
#include <thread>
#include <vector>
#include <shared_mutex>
#include <chrono>
class SharedResource {
public:
void read() {
std::shared_lock<std::shared_mutex> lock(mutex_);
// 在这里读取共享资源
std::cout << "Thread " << std::this_thread::get_id() << " is reading...\n";
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模拟耗时操作
}
void write(int value) {
std::unique_lock<std::shared_mutex> lock(mutex_);
// 在这里写入共享资源
std::cout << "Thread " << std::this_thread::get_id() << " is writing: " << value << '\n';
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 模拟耗时操作
}
private:
std::shared_mutex mutex_; // 读写锁
};
// ... 其他代码,例如线程创建和启动
接下来,我们可以创建一些线程来读取和写入这个共享资源。这里只提供一个示例,展示如何创建线程:
int main() {
SharedResource resource;
// 创建并启动多个线程来读取资源
std::vector<std::thread> readers;
for (int i = 0; i < 5; ++i) {
readers.emplace_back([&resource]() {
for (int j = 0; j < 3; ++j) {
resource.read();
}
});
}
// 创建一个线程来写入资源
std::thread writer([&resource]() {
for (int i = 0; i < 3; ++i) {
resource.write(i);
}
});
// 等待所有线程完成
for (auto& t : readers) {
t.join();
}
writer.join();
return 0;
}
在这个例子中,std::shared_lock用于读取操作,因为它允许多个读者同时访问共享资源(只要没有写者正在访问)。而std::unique_lock用于写入操作,因为它会阻止其他读者或写者同时访问共享资源。注意,当使用std::shared_mutex时,你应该总是使用std::shared_lock或std::unique_lock来锁定和解锁它,而不是直接调用其成员函数。
多用组合、少用继承
基于接口而非实现进行编程