c++中unique_lock,怎么锁定共有变量
时间: 2024-10-12 21:14:23 浏览: 26
`std::unique_lock` 是 C++17 引入的一个容器适配器,用于管理互斥锁(mutex)。它是 `std::lock_guard` 的更通用版本,适用于那些不能使用 RAII(Resource Acquisition Is Initialization)技术的资源,如共享所有权或非自动释放的锁。
如果你想锁定一个共有(shared)变量并确保多个线程同时读取该变量,你应该使用 `std::shared_mutex` 而不是普通 mutex。`std::shared_mutex` 支持读写操作,当有多个读锁时,读操作是互不冲突的;但如果有写锁,则所有其他线程都会被阻塞。
以下是如何使用 `std::unique_lock` 来锁定 `std::shared_mutex` 的例子:
```cpp
#include <thread> // std::thread
#include <mutex> // std::shared_mutex, std::unique_lock
#include <atomic> // std::atomic for shared data
// 假设我们有一个 shared counter 变量
std::atomic<int> shared_counter(0);
// 创建一个 shared_mutex 对象
std::shared_mutex counter_lock;
void reader_thread() {
std::unique_lock<std::shared_mutex> lock(counter_lock);
while (shared_counter.load() <= 5) { // 读取计数器,直到达到某个条件
std::cout << "Reader: Counter is " << shared_counter.load() << "\n";
}
}
void writer_thread() {
std::unique_lock<std::shared_mutex> lock(counter_lock, std::defer_lock); // 尝试获取写锁
lock.lock(); // 当没有其他读者时,这里获得锁
// 更新计数器
shared_counter.fetch_add(1);
// 释放锁,允许其他读者进来
lock.unlock();
}
int main() {
std::thread reader(reader_thread);
std::thread writer(writer_thread);
reader.join();
writer.join();
return 0;
}
```
在这个例子中,reader_thread 和 writer_thread 分别尝试读取和更新 `shared_counter`,通过 `shared_mutex` 实现了读写操作的并发控制。注意,writer_thread 需要先用 `std::defer_lock` 初始化锁,然后在获得锁之前检查是否有其他读者。
阅读全文