线程同步之读写锁--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来锁定和解锁它,而不是直接调用其成员函数。

posted @ 2024-07-04 17:08  guanyubo  阅读(30)  评论(0编辑  收藏  举报