lock_guard和shared_lock
时间: 2025-04-18 19:20:14 浏览: 27
### C++ `lock_guard` 和 `shared_lock` 的区别及使用场景
#### 锁卫士 (`lock_guard`) 特点与适用范围
`std::lock_guard<std::mutex>` 是一种简化版的互斥锁管理器,用于自动获取和释放互斥锁。当创建 `lock_guard` 实例时会立即锁定关联的互斥量;而对象销毁时则自动解锁该互斥量[^1]。
对于只读访问或写入独占模式下保护临界区非常有用,在这种情况下不需要共享读取权限给其他线程。下面是一个简单的例子展示如何利用它来同步两个并发执行的任务:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int shared_data = 0;
void thread_function() {
std::lock_guard<std::mutex> lock(mtx);
++shared_data; // 对共享资源进行操作
}
int main() {
std::thread t1(thread_function);
std::thread t2(thread_function);
t1.join();
t2.join();
std::cout << "Shared data: " << shared_data << std::endl;
return 0;
}
```
这段代码展示了通过 `lock_guard` 来确保多个线程安全地更新同一个全局变量 `shared_data`。
#### 共享锁 (`shared_lock`) 功能描述及其应用场景
不同于 `lock_guard` 总是以独占方式持有互斥锁,`std::shared_lock` 支持多个读者可以同时拥有相同的可重入锁实例,即允许多个线程在同一时间以只读的方式访问受保护的数据结构而不互相阻塞。然而一旦有任意一个线程尝试获得写入权限,则所有现有的以及新的读请求都将被挂起直到写者完成其工作并释放相应的锁[^2]。
这里给出一段示范性的代码片段说明怎样运用 `shared_lock` 进行多线程间的协作:
```cpp
#include <iostream>
#include <vector>
#include <string>
#include <memory>
#include <chrono>
#include <thread>
#include <mutex>
#include <shared_mutex>
class DataCache {
public:
void readData(int id) const {
std::shared_lock<std::shared_timed_mutex> guard(m_);
auto value = cache_[id];
std::this_thread::sleep_for(std::chrono::milliseconds(1));
std::cout << "[Reader-" << id << "] Value is " << value << '\n';
}
private:
mutable std::shared_timed_mutex m_;
std::vector<int> cache_{{1, 2, 3}};
};
// 假设这里有另一个成员函数负责修改数据...
```
在这个案例里,`readData()` 方法内部定义了一个局部作用域内的 `shared_lock` 变量 `guard` ,这使得同一时刻内能够存在若干个这样的读取过程共存于系统之中,从而提高了程序整体性能表现。
阅读全文
相关推荐



















