std::unique_lock<std::mutex> 用法
时间: 2023-06-05 20:05:09 浏览: 57
std::unique_lock<std::mutex> 是 C++11 标准库中用于实现互斥锁的一种方式,可以通过 unique_lock 实例的构造函数和析构函数来自动完成锁和解锁的过程,在多线程编程中常用于实现线程安全。
相关问题
std::unique_lock<std::mutex> lock
std::unique_lock<std::mutex> lock 是在C++中使用std::unique_lock对std::mutex进行加锁的方法。它提供了比std::lock_guard更高级的功能。
以下是一个示例代码:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mutex_;
void threadFunction()
{
std::unique_lock<std::mutex> lock(mutex_);
// 在这里执行需要保护的代码
std::cout << "线程已获得锁" << std::endl;
// ...
std::cout << "线程释放锁" << std::endl;
}
int main()
{
std::thread t1(threadFunction);
std::thread t2(threadFunction);
t1.join();
t2.join();
return 0;
}
```
在上面的示例中,我们创建了两个线程t1和t2,并且它们都会执行threadFunction函数。在threadFunction函数中,我们使用std::unique_lock<std::mutex> lock(mutex_)来锁定互斥量mutex_,以确保同一时间只有一个线程能够访问被保护的代码。当一个线程获得锁时,其他线程将被阻塞,直到锁被释放。
std::unique_lock<std::mutex> locker(myMutex)
`std::unique_lock<std::mutex> locker(myMutex)`是C++中使用互斥量的一种方式。它使用`std::mutex`对象`myMutex`来创建一个`std::unique_lock`对象`locker`,并自动上锁互斥量。当`locker`对象超出作用域时,会自动解锁互斥量。
这种方式相比直接使用`std::mutex`对象进行上锁和解锁,具有更灵活的特性。例如,`std::unique_lock`对象可以在任何时候手动上锁和解锁,而不仅仅是在对象的构造和析构期间。此外,`std::unique_lock`还提供了一些额外的功能,如延迟上锁、尝试上锁等。
下面是一个示例代码,演示了如何使用`std::unique_lock<std::mutex>`来保护临界区:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex myMutex;
void criticalSection()
{
std::unique_lock<std::mutex> locker(myMutex); // 上锁互斥量
// 在这里执行需要保护的临界区代码
// 互斥量会在locker对象超出作用域时自动解锁
}
int main()
{
std::thread t1(criticalSection);
std::thread t2(criticalSection);
t1.join();
t2.join();
return 0;
}
```
在上面的示例中,`std::unique_lock<std::mutex>`对象`locker`会在`criticalSection()`函数中上锁互斥量`myMutex`,以保护临界区代码的执行。当`locker`对象超出作用域时,会自动解锁互斥量。