std::unique_lock详解

目录

 

std::unique_lock代替std::lock_guard

unique_lock的第二个参数

std::adopt_lock

std::try_to_lock

std::defer_lock

unique_lock的成员函数

lock()

unlock()

try_lock()

release()


 

std::unique_lock代替std::lock_guard

std::unique_lock的作用与std::lock_guard基本相同,也是用于管理对互斥量的锁定与解锁,但更加的灵活。std::unique_lock支持std::lock_guard的所用操作,用法也基本相同,同时还支持一些其他的操作,包括延迟锁定、条件等待、尝试锁定、锁定时长、使用权转移、手动解锁。

unique_lock的第二个参数

std::adopt_lock

表示互斥量已将lock了,线程已经获得了互斥量的所有权,不需要再使用unique_lock获取锁。这个功能lock_guard也可以使用,与unique_lock中的含义相同。

使用adopt_lock需要确保线程已经获取了锁。

std::try_to_lock

当使用了std::try_to_lock后,如果没有获得锁,std::unique_lock并不会阻塞当前的线程,可以去执行一些其他的操作,等一段时间后再尝试获取锁,或者返回通知我们获取锁失败,然后继续执行代码。

但使用std::try_to_lock()时,要注意确保本线程还未被获取锁。否则使用std::try_to_lock()再次尝试上锁将导致出错。

#include<iostream>
#include<thread>
#include<mutex>
#include<list>

using namespace std;

mutex mut;
list<int> mydata;
void newthread()
{
    unique_lock<std::mutex> myuq_lock(mut, try_to_lock);
    if (myuq_lock.owns_lock())
    {
        //成功获得锁
        mydata.push_back(6);
    }
    else
    {
        cout << "获得锁失败" << endl;   //失败获得锁
    }


}
int main()
{
    thread mythread1(newthread);
    thread mythread2(newthread);
    mythread1.join();
    mythread2.join();
}

std::defer_lock

std::defer_lock的作用是延迟锁的获取,表示unique_lock初始时不要尝试获取锁,而是当调用lock或者try_lock成员函数时再获取锁。使用std::defer_lock同样需要确保线程还未获得锁头。

#include<iostream>
#include<thread>
#include<mutex>
#include<list>

using namespace std;

mutex mut;
list<int> mydata;
void newthread()
{
    unique_lock<std::mutex> myuq_lock(mut,defer_lock);
    myuq_lock.lock();
    mydata.push_back(6);


}
int main()
{
    thread mythread1(newthread);
    thread mythread2(newthread);
    mythread1.join();
    mythread2.join();
}

unique_lock的成员函数

lock()和unlock()

unique_lock对象也可以显式的调用lock()和unlock()去获取和释放锁。

try_lock()

尝试获取锁,如果获取成功则返回true,失败则返回false。一般与defer_lock配合使用。

release()

释放std::unique对互斥量的所用权,并返回管理的mutex的对象指针。使用release()后,需要手动的调用互斥量的unlock()成员函数释放锁。

unique_lock所有权的传递

与unique_ptr相似,unique_lock对mutex对象的所用权可以转移,但不可以复制。同一时间,mutex的所有权仅能被一个unique_lock拥有。可以使用std::move()转移unique_lock的所有权。

 

  • 30
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
std::unique_lockC++标准库中的一个类,用于提供对互斥量的独占访问。它的构造函数相对于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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼多不菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值