lock_gard unique_locke lock 多个锁
时间: 2023-09-07 20:11:17 浏览: 74
你可以使用 `std::lock` 函数来锁定多个互斥量。这个函数会保证在一个原子操作中锁定所有的互斥量,以避免死锁风险。
下面是一个示例:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mutex1, mutex2;
void threadFunc1()
{
// 使用 std::unique_lock 对 mutex1 进行锁定
std::unique_lock<std::mutex> lock1(mutex1, std::defer_lock);
// 使用 std::unique_lock 对 mutex2 进行锁定
std::unique_lock<std::mutex> lock2(mutex2, std::defer_lock);
// 锁定多个互斥量
std::lock(lock1, lock2);
// 执行需要保护的代码
std::cout << "Thread 1: locked mutex1 and mutex2\n";
// 解锁互斥量
lock1.unlock();
lock2.unlock();
}
void threadFunc2()
{
// 使用 std::unique_lock 对 mutex1 进行锁定
std::unique_lock<std::mutex> lock1(mutex1, std::defer_lock);
// 使用 std::unique_lock 对 mutex2 进行锁定
std::unique_lock<std::mutex> lock2(mutex2, std::defer_lock);
// 锁定多个互斥量
std::lock(lock1, lock2);
// 执行需要保护的代码
std::cout << "Thread 2: locked mutex1 and mutex2\n";
// 解锁互斥量
lock1.unlock();
lock2.unlock();
}
int main()
{
std::thread t1(threadFunc1);
std::thread t2(threadFunc2);
t1.join();
t2.join();
return 0;
}
```
在上述示例中,我们使用了 `std::unique_lock` 对互斥量进行锁定,并使用 `std::lock` 函数对多个互斥量进行锁定。这样可以确保两个线程在执行需要保护的代码之前同时获取到所需的锁。
阅读全文