std::unique_lock
时间: 2023-08-21 18:02:08 浏览: 131
C++11多线程加锁方式.doc
std::unique_lock是C++标准库中的一个类,用于提供对互斥量的独占访问。它的构造函数相对于std::lock_guard更加灵活,可以接受额外的参数。std::unique_lock的构造函数有多个版本,其中一个默认构造函数的声明如下:unique_lock() noexcept; \[1\]
另外,std::unique_lock还提供了移动构造函数,可以将一个std::unique_lock对象移动到另一个对象中。例如,在下面的例子中,rtn_unique_lock函数返回一个std::unique_lock对象,然后在work1函数中使用移动构造函数将其移动到munique2对象中:\[2\]
```cpp
std::unique_lock<std::mutex> rtn_unique_lock() {
std::unique_lock<std::mutex> tmp(mlock);
return tmp;
}
void work1(int& s) {
for (int i = 1; i <= 5000; i++) {
std::unique_lock<std::mutex> munique2 = rtn_unique_lock();
s += i;
}
}
```
此外,std::unique_lock还提供了一个成员函数owns_lock,用于判断当前std::unique_lock对象是否获得了锁。在下面的例子中,print_star函数使用std::unique_lock对象尝试对互斥量进行加锁,如果成功则打印'*',否则打印'x':\[3\]
```cpp
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
std::mutex mtx; // 互斥量
void print_star() {
std::unique_lock<std::mutex> lck(mtx, std::try_to_lock);
if (lck)
std::cout << '*';
else
std::cout << 'x';
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 500; ++i)
threads.emplace_back(print_star);
for (auto& x : threads)
x.join();
return 0;
}
```
综上所述,std::unique_lock是一个灵活的类,用于提供对互斥量的独占访问,并且具有多个构造函数和移动构造函数,以及一个owns_lock成员函数用于判断是否获得了锁。
#### 引用[.reference_title]
- *1* *3* [std::unique_lock 介绍](https://blog.csdn.net/u012372584/article/details/96852295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [C++多线程unique_lock详解](https://blog.csdn.net/Charles_Zaqdt/article/details/104180967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文