读写锁std::shared_mutex

190 阅读1分钟

以下是一个示例,演示了如何在 C++ 中使用读写锁(std::shared_mutex)实现读写线程之间的同步:

#include <iostream>
#include <thread>
#include <shared_mutex>
#include <vector>

// 共享资源
std::vector<int> sharedData;
std::shared_mutex rwMutex;

// 读线程函数
void readerFunction(int id) {
    std::shared_lock<std::shared_mutex> lock(rwMutex);
    std::cout << "Reader " << id << ": Reading shared data: ";
    for (int data : sharedData) {
        std::cout << data << " ";
    }
    std::cout << std::endl;
}

// 写线程函数
void writerFunction(int id, int value) {
    std::unique_lock<std::shared_mutex> lock(rwMutex);
    std::cout << "Writer " << id << ": Writing value " << value << std::endl;
    sharedData.push_back(value);
}

int main() {
    // 创建若干个读线程和写线程
    std::vector<std::thread> readers;
    std::vector<std::thread> writers;

    for (int i = 0; i < 5; ++i) {
        readers.emplace_back(readerFunction, i);
        writers.emplace_back(writerFunction, i, i * 10);
    }

    // 等待所有读线程和写线程执行完成
    for (std::thread &reader : readers) {
        reader.join();
    }
    for (std::thread &writer : writers) {
        writer.join();
    }

    return 0;
}

在这个示例中,我们有多个读线程和写线程,它们访问一个共享的数据结构 sharedData。读线程使用了 std::shared_lock<std::shared_mutex> 来获取共享锁,写线程使用了 std::unique_lock<std::shared_mutex> 来获取独占锁。

读线程和写线程之间共享一个读写锁 rwMutex,它允许多个读线程同时访问共享资源,但是在写入时需要独占锁。这样就提高了程序的并发性能。

main 函数中,我们创建了多个读线程和写线程,并等待它们执行完成。读线程输出共享数据的内容,写线程将新数据写入共享数据结构中。