lock_guard<mutex> lock代码示例
时间: 2023-08-27 20:07:06 浏览: 90
下面是一个使用 `lock_guard` 的示例代码:
```cpp
#include <iostream>
#include <mutex>
#include <thread>
std::mutex mtx; // 全局互斥锁
void printNumbers(int n) {
std::lock_guard<std::mutex> lock(mtx); // 声明一个锁保护区域
for (int i = 1; i <= n; i++) {
std::cout << i << " ";
}
std::cout << std::endl;
}
int main() {
std::thread t1(printNumbers, 5);
std::thread t2(printNumbers, 10);
t1.join();
t2.join();
return 0;
}
```
上面的代码定义了一个全局互斥锁 `mtx`,并在 `printNumbers` 函数中使用了 `lock_guard` 声明一个锁保护区域。在 `main` 函数中,我们创建了两个线程分别调用 `printNumbers` 函数,并在主线程中等待两个线程执行完毕后退出。当一个线程获得了锁之后,另一个线程会被阻塞等待锁的释放,从而保证了输出的正确性。
相关问题
lock_guard<mutex> lock
这是 C++11 中的一个线程安全的工具,用于保护共享资源。在多线程环境中,当多个线程同时访问某个共享资源时,如果没有加锁,就会出现数据竞争和不可预测的结果。lock_guard<mutex> lock 这行代码使用了 RAII(资源获取即初始化)技术,它会在构造函数中获取 mutex 的锁,确保在离开作用域时自动释放锁,从而避免了手动加锁和解锁的繁琐和容易出错。
std::lock_guard<std::mutex> recv_lock和std::lock_guard<std::mutex> its_lock
`std::lock_guard<std::mutex>`是C++中的一个RAII(资源获取即初始化)类模板,用于在作用域内自动获取互斥锁,并在作用域结束时释放锁。它的构造函数接受一个互斥锁对象作为参数,并在构造函数中获取锁,析构函数中释放锁。
`std::lock_guard<std::mutex> recv_lock`和`std::lock_guard<std::mutex> its_lock`都是使用`std::lock_guard`模板创建的对象,分别用于获取名为`recv_mutex`和`its_mutex`的互斥锁。
以下是两个示例:
1. 使用`std::lock_guard<std::mutex> recv_lock`获取`recv_mutex`互斥锁:
```cpp
std::mutex recv_mutex;
// ...
void someFunction() {
std::lock_guard<std::mutex> recv_lock(recv_mutex);
// 在这里获取了recv_mutex互斥锁,可以安全地访问受保护的资源
// 作用域结束时,recv_lock析构函数会自动释放recv_mutex互斥锁
}
```
2. 使用`std::lock_guard<std::mutex> its_lock`获取`its_mutex`互斥锁:
```cpp
std::mutex its_mutex;
// ...
void someOtherFunction() {
std::lock_guard<std::mutex> its_lock(its_mutex);
// 在这里获取了its_mutex互斥锁,可以安全地访问受保护的资源
// 作用域结束时,its_lock析构函数会自动释放its_mutex互斥锁
}
```
阅读全文