4.C++多线程-- unique_lock(类模板)

news/2023/9/27 7:06:03

1.unique_lock

1. unique_lock<mutex> myUniLock(myMutex); 完全可以取代lock_guard

2. unique_lock 也可以使用----std::adopt_lock

3.使用adopt_lock,之前要先使用lock.

4.std::chrono::milliseconds my_sleepTime(20000)//20000毫秒

       std::this_thread::sleep_for(my_sleep);// 开始休息20秒

关键词1:try_to_lock

  • 尝试用mutex的lock()去锁定这个mutex,但如果没有锁定成功,会立即返回,不会阻塞在那里;
  • 使用try_to_lock的原因是防止其他的线程锁定mutex太长时间,导致本线程一直阻塞在lock这个地方
  • 前提:不能提前lock();
  • owns_lock()方法判断是否拿到锁,如拿到返回true

关键词2:defer_lock

  • 如果没有第二个参数就对mutex进行加锁,加上defer_lock是始化了一个没有加锁的mutex
  • 不给它加锁的目的是以后可以调用unique_lock的一些方法
  • 前提:不能提前lock
  • 不用自己unlock,有点类似智能指针;当然也可以自己提前解锁

 关键词3:try_lock():尝试给互斥量加锁
如果拿不到锁,返回false,否则返回true。

关键词4:release()

 2.总结

adopt_lock:

使用之前先lock,不能自己unlock

my_mutex.lock();
unique_lock<mutex> myUniLock(my_mutex,adopt_lock);
{	//my_mutex.lock();my_list.push_back(i);cout << "插入元素:" << i << endl;//my_mutex.unlock();
}

 try_to_lock 

使用之前不能先lock, try_to_lock会自己先尝试进行加锁。如果不能加锁,通过判断直接执行其他

defer_lock 见上

#include<iostream>
#include<list>
#include<thread>
#include<mutex>using namespace std;
class son_thread {
public:void product() {for (int i = 0; i < 10000; i++) {unique_lock<mutex> myUniLock(my_mutex, defer_lock);myUniLock.lock();{	//my_mutex.lock();my_list.push_back(i);cout << "插入元素:" << i << endl;//my_mutex.unlock();}//my_mutex.unlock();}}void consume() {my_mutex.lock();if (my_list.empty()) {cout << "容器为空" << endl;}else {cout << " 进行消费" << my_list.front() << endl;my_list.pop_front();}my_mutex.unlock();}void consume_continue() {while (1) {this->consume();}}
private:std::mutex my_mutex;list<int>my_list;
};int main() {son_thread s1;thread obj1(&son_thread::product, &s1);thread obj2(&son_thread::consume_continue,&s1);obj1.join();obj2.join();return 0;
}

 


https://dhexx.cn/news/show-4633531.html

相关文章

SpringBoot源码分析:SpringBoot整合Tomcat(三)

一、概述 SpringBoot整合Tomcat整体启动流程如下图&#xff0c;接下来我们就按照改流程分析SpringBoot中内嵌Tomcat的启动流程。 二、启动流程 通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.onRefresh方法。 之后进入子类ServletWebServerAppl…

短视频矩阵源码技术开发

短视频矩阵是一种常见的视频编码标准&#xff0c;它通过将视频分成多个小块并对每个小块进行压缩来实现高效的视频传输。在本文中&#xff0c;我们将介绍短视频矩阵的原理和实现&#xff0c;并提供示例代码。 $where_time array(); // 时间 $where_time[] array(name>fbr…

Linux Shell脚本攻略

一、echo命令 1、在echo中转义换行符 默认情况下&#xff0c;echo会在输出文本的尾部追加一个换行符。可以使用选项-n来禁止这种行为。 echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时&#xff0c;需要使用echo -e "包含转义序列的字符串"这…

Unity基础框架从0到1(六)对象池模块

索引 这是Unity基础框架从0到1的第六篇文章&#xff0c;框架系列的项目地址是&#xff1a;https://github.com/tang-xiaolong/SimpleGameFramework 文章最后有目前框架系列的思维导图&#xff0c;前面的文章和对应的视频我一起列到这里&#xff1a; 文章 Unity基础框架从0到…

ChatGPT热度不减!华为宣布入局,盘古GPT能否大杀四方!

ChatGPT热度不减 六月份了&#xff0c;朋友们&#xff0c;来到六月份了已经&#xff0c;ChatGPT的热度依旧不减&#xff0c;各大论坛网站的榜单上还飘着ChatGPT相关话题的文章&#xff0c;且排名靠前。由此可见&#xff0c;这ChatGPT这股子热潮还得持续一段时间呢。 而且ChatG…

应对数据不平衡和过拟合的分类模型优化策略

不平衡分类 数据类别不平衡问题是指数据集中各类别样本数量不对等的情况。 基于抽样的方法 在处理这类问题时&#xff0c;可以采用基于抽样的方法来解决。以下是几种常见的基于抽样的方法&#xff1a; 两阶段学习 两阶段学习是一种解决不平衡分类问题的方法&#xff0c;包括…

Java开发手册中为什么要求谨慎使用ArrayList中的sublist方法

场景 Java开发手册中对于ArrayList的subList的要求如下&#xff1a; 【强制】ArrayList 的 subList 结果不可强转成 ArrayList&#xff0c;否则会抛出 ClassCastException 异常&#xff1a; java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。 说明&a…

c盘清理软件:清理垃圾、扩大c盘和系统迁移

一、为什么要c盘清理软件 Windows系统采用了NTFS文件系统&#xff0c;这种文件系统特点是有文件碎片和系统产生的临时文件会大量存储到系统盘上&#xff0c;而且在使用电脑的过程中&#xff0c;由于程序的安装、升级、卸载和其他操作会产生大量无用的垃圾文件&#xff0c;这些…

XML入库后空白字符丢失问题

最近项目上在做电子病历&#xff0c;使用的是第三方的电子病历组件&#xff0c;该病历组件是利用XML来组织数据的。界面上渲染出来的效果如下图&#xff1a; XML渲染后的界面 对应的后台数据&#xff08;已做简化处理&#xff09;是如下XML格式的&#xff0c;其中的空格部分是…

k8s pvc详解

一、概述 PVC 的全称是&#xff1a;PersistentVolumeClaim&#xff08;持久化卷声明&#xff09;&#xff0c;PVC 是用户存储的一种声明&#xff0c;PVC 和 Pod 比较类似&#xff0c;Pod 消耗的是节点&#xff0c;PVC 消耗的是 PV 资源&#xff0c;Pod 可以请求 CPU 和内存&am…