在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>
,它是一个读锁,允许多个线程同时进行读操作,但如果有线程正在写入,则读操作会等待写操作完成。
这种方式确保了在对共享资源进行写操作时,不会有其他线程同时读取或写入该资源,从而保证了数据的一致性和线程安全。