C++写锁的实现

在C++中,实现写锁通常涉及到同步原语,如互斥锁(std::mutex)、读写锁(std::shared_mutex 在C++17中引入)等。std::shared_mutex允许多个读操作同时进行,但写操作是独占的,即在执行写操作时,任何其他的读或写操作都会被阻塞,直到写操作完成。

下面是一个简单的例子,展示如何使用std::shared_mutex来实现写锁。这个例子中包含了一个类,这个类使用std::shared_mutex来同步对一个共享资源的访问。

#include <iostream>
#include <shared_mutex>
#include <string>
#include <thread>

class ThreadSafeCounter {
public:
    // 构造函数
    ThreadSafeCounter() = default;

    // 禁止拷贝构造和赋值
    ThreadSafeCounter(const ThreadSafeCounter&) = delete;
    ThreadSafeCounter& operator=(const ThreadSafeCounter&) = delete;

    // 增加计数器的值
    void increment() {
        // 写锁
        std::unique_lock<std::shared_mutex> lock(mutex_);
        ++value_;
    }

    // 获取计数器的值
    int get() const {
        // 读锁
        std::shared_lock<std::shared_mutex> lock(mutex_);
        return value_;
    }

private:
    mutable std::shared_mutex mutex_;
    int value_ = 0;
};

int main() {
    ThreadSafeCounter counter;

    auto increment_and_print = [&counter]() {
        for (int i = 0; i < 3; ++i) {
            counter.increment();
            std::cout << std::this_thread::get_id() << ' ' << counter.get() << '\n';
        }
    };

    std::thread thread1(increment_and_print);
    std::thread thread2(increment_and_print);

    thread1.join();
    thread2.join();

    return 0;
}

在这个例子中,increment方法使用std::unique_lock<std::shared_mutex>来加锁,这实际上是一个写锁,因为它阻止了任何其他的读或写操作。而get方法使用的是std::shared_lock<std::shared_mutex>,它是一个读锁,允许多个线程同时进行读操作,但如果有线程正在写入,则读操作会等待写操作完成。

这种方式确保了在对共享资源进行写操作时,不会有其他线程同时读取或写入该资源,从而保证了数据的一致性和线程安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值