当前位置: 首页 > news >正文

9.30学习记录(补)

手撕线程池:

1.进程:进程就是运行中的程序

2.线程的最大数量取决于CPU的核数

3.创建线程 thread t1; 

在使用多线程时,由于线程是由上至下走的,所以主程序要等待线程全部执行完才能结束否则就会发生报错。通过thread.join()来实现

但是如果在一个比较严谨的项目中,我们最好在使用join函数的时候先判断一下是不是可以使用join函数,可以通过joinable函数来判断 它返回的是一个bool值。

join函数是阻塞的,当线程函数没有执行完时,整个程序是卡在join函数的位置。

线程函数可以传参数,如下图所示:

4.在使用多线程时,要注意几个问题:

线程函数中数据未定义的错误

1.传递临时变量的问题:

在传递参数时如果参数是临时变量,那么这个程序会报错,是无法编译的。所以 我们可以使用ref函数来传递引用类型,这样程序就可以正常运行了。

2.传递指针或引用指向局部变量的问题

如下图所示: a是一个局部的变量,它只在test上是有效的,存放在栈区,如果test结束调用return(void 可以隐藏return)a变量的地址就被释放掉了,那么线程函数无法取到a的引用,所以会报错,解决方法就是将a定义成全局变量。

 3.传递指针或引用指向已经释放的内存的问题

4.类对象可能被释放掉,

  

所以可以引出智能指针share_ptr来管理这个类的对象,防止因为某些原因将对象a释放掉导致地址a的丢失, 通过引入指针可以,但是最后还是要记得释放指针所占用的内存,所以引出了智能指针。

 

 5.如何确定你的线程是线程安全的?

如果多线程的程序每次运行结果与单线程运行结果始终是一样的,那么你的线程就是线程安全的

6.互斥量死锁 

两个线程相互等待导致的死锁

解决方法就是改变一下获取锁的顺序就好了。

 让先获取m的线程m和m2都获取,这样就不会出现互相等待的情况了。

7.lock_guard

lock_guard是C++标准库中的一种互斥量封装类,用于保护共享数据,防止多个线程同时访问同一资源而导致的数据竞争的问题。特点如下:

1.当构造函数被调用时,该互斥量会被自动锁定。

2.当析构函数被调用时,该互斥量会被自动解锁。

std::lock_guard对象不能复制或移动,因此他只能在局部作用域中使用。因为在源码中他禁用了拷贝构造和等号。

8.unique_lock

用于管理互斥量(mutex)的锁定和解锁操作。它提供了比直接使用std::lock_guard更灵活的互斥量管理方式。

函数try_lock_for()可以等待一段时间,正常的锁是一直等待的,而这个unique_lock可以支持,时间到之后就不等了,直接返回掉。

9.std::call_once

它是 C++ 标准库中的一个函数模板,用于保证某个函数在多线程环境下仅被调用一次。它与懒汉模式的单例实现等场景密切相关,有助于解决多线程中初始化资源时可能出现的多次初始化问题。 

10.实现生产者消费者模型:

11.线程池:

emplace_ back和push_back()区别;

push_back()会执行一个拷贝构造,它会创建一个临时对象,然后将这个临时对象复制或者移动到容器的末尾。

emplace_back直接调用构造函数,它直接在容器的末尾就地构造元素,避免了创建临时对象的开销(如果构造函数的参数可以直接用来初始化对象的话)。

#include<iostream>
#include<thread>
#include<functional>
#include<mutex>
#include<condition_variable>
#include<vector>
#include<queue>class ThreadPool {
public:ThreadPool(int numThreads) :stop(false) {for (int i = 0; i < numThreads; i++) {threads.emplace_back([this] {//创建并添加一个新的线程。每个线程执行一个 lambda 函数while (true) {std::unique_lock<std::mutex> lock(mtx);condition.wait(lock, [this] { return stop || !tasks.empty(); });//使用lambda表达式 如果为false 为空 阻塞在这里//如果为true 代表任务队列不为空 就往下运行if (stop && tasks.empty()) {return;}std::function<void()> task(std::move(tasks.front()));tasks.pop();lock.unlock();task();}});}}~ThreadPool() {{std::unique_lock<std::mutex> lock(mtx);stop = true;}condition.notify_all();for (std::thread& thread : threads) {thread.join();}}template<typename F, typename... Args>void enqueue (F&& f, Args&&... args){//...是可变参数包的语法标记,表示Args可以接受零个或多个类型参数std::function<void()> task(std::bind(std::forward<F>(f), std::forward<Args...>));{std::unique_lock<std::mutex> lock(mtx);tasks.emplace(std::move(task));}condition.notify_one();}
private:std::vector<std::thread> threads;std::queue<std::function<void()>> tasks;std::mutex mtx;std::condition_variable condition;bool stop;
};
int main() {ThreadPool pool(4);for (int i = 0; i < 8; ++i) {pool.enqueue([i] {std::cout << "Task " << i << " is running in thread " << std::this_thread::get_id() << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "Task " << i << " is done" << std::endl;});}return 0;
}

12.字符串转整形

#include<iostream>
#include<string>int StrToInt(char* str) {//字符串转整形int number=0;while (*str!=0) {number = number * 10 + *str - '0';++str;}return number;
}int main() {char* ptr = new char[6];//分配能容纳6个字符(包括'\0')的内存strcpy_s(ptr,6,"world");std::cout<<StrToInt(ptr);}

相关文章:

9.30学习记录(补)

手撕线程池: 1.进程:进程就是运行中的程序 2.线程的最大数量取决于CPU的核数 3.创建线程 thread t1; 在使用多线程时&#xff0c;由于线程是由上至下走的&#xff0c;所以主程序要等待线程全部执行完才能结束否则就会发生报错。通过thread.join()来实现 但是如果在一个比…...

移动应用中提升用户体验的因素

用户体验&#xff08;UX&#xff09;是任何移动应用程序成功的关键因素。随着数以百万计的应用程序争夺注意力&#xff0c;提供无缝、愉快和高效的体验可能是获得忠实用户或在一次互动后失去忠实用户之间的区别。无论是商业应用程序、游戏还是社交平台&#xff0c;增强用户体验…...

VS与VSCode的区别

文章目录 1. 什么是 Visual Studio 和 Visual Studio Code&#xff1f;Visual Studio&#xff08;VS&#xff09;Visual Studio Code&#xff08;VS Code&#xff09; 2. 主要区别详解性能和资源占用功能和复杂性扩展和自定义适用场景价格 3. 详细对比总结4. 如何选择适合自己的…...

用Python和OpenCV实现人脸识别:构建智能识别系统

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 人脸识别技术在现代社会的各个领域得到了广泛应用,从智能手机的面部解锁到公共场所的安全监控,人脸识别已经成为一项日益重要的技术。本教程将指导你使用Python中的OpenCV库来构建一个简单的人脸检测与识别系统…...

微积分-反函数6.5(指数增长和衰减)

在许多自然现象中&#xff0c;数量的增长或衰减与其大小成正比。例如&#xff0c;如果 y f ( t ) y f(t) yf(t) 表示在时间 t t t 时某种动物或细菌种群的个体数量&#xff0c;那么似乎可以合理地假设增长速率 f ’ ( t ) f’(t) f’(t) 与种群 f ( t ) f(t) f(t) 成正比…...

C初阶(十二)do - while循环 --- 致敬革命烈士

大家国庆看阅兵仪式和天安门升旗仪式了吗&#xff1f;岁月安好&#xff0c;只因有人负重前行。 ————山那边是什么 ————是烈士的英魄 ————是他们拼死保卫的新中国 ————河那边是什么 ————是绵延的战火 ————她望着远方泪一滴滴的落 ————和平来了 ——…...

从零开始:SpringBoot实现古典舞在线交流平台

第二章 相关技术介绍 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…...

AL生成文章标题指定路径保存:创新工具助力内容创作高效启航

在信息爆炸的时代&#xff0c;一个吸引人的标题是文章成功的第一步。它不仅要准确概括文章内容&#xff0c;还要能激发读者的好奇心&#xff0c;促使他们点击阅读。随着人工智能技术的飞速发展&#xff0c;AL生成文章标题功能正逐渐成为内容创作者的新宠&#xff0c;看看它是如…...

java基础知识汇总

以下内容是学习《java核心技术卷1》的学习笔记 一、一个简单的java应用程序 public class App { public static void main(String[] args) { System.out.println("yuanyexiaolu"); } } 代码解释&#xff1a; 关键字public称为访问修饰符&#xff0c;这些修饰…...

2.点位管理|前后端如何交互——帝可得后台管理系统

目录 前言点位管理菜单模块1.需求说明2.库表设计3.生成基础代码0 .使用若依代码生成器最终目标1.创建点位管理2.添加数据字典3.配置代码生成信息4.下载代码并导入项目 4.优化菜单——点位管理1.优化区域管理2.增加点位数3. 合作商4.区域管理中添加查看详情功能5.合作商添加点位…...

Redis基础二(spring整合redis)

Springboot整合Redis 一、Springboot整合redis ​ redis可以通过使用java代码来实现 第一部分文档中 在终端操作redis的所有命令&#xff0c;Spring已经帮我们封装了所有的操作&#xff0c;所以变得很简单了。 ​ Spring专门提供了一个模块来进行这些操作的封装&#xff0c;这…...

JAVA开源项目 教学资源库系统 计算机毕业设计

本文项目编号 T 067 &#xff0c;文末自助获取源码 \color{red}{T067&#xff0c;文末自助获取源码} T067&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计5.4.1 管…...

二分查找算法专题(2)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 对于二分查找算法不是很了解或者只了解一部分的小伙伴一定要去看下面这篇博客&#xff1a;二分查找算法的介绍与另外一种查找方…...

[Python] 编程入门:理解变量类型

文章目录 [toc] 整数常见操作 浮点数字符串字符串中混用引号问题字符串长度计算字符串拼接 布尔类型动态类型特性类型转换结语 收录专栏&#xff1a;[Python] 在编程中&#xff0c;变量是用于存储数据的容器&#xff0c;而不同的变量类型则用来存储不同种类的数据。Python 与 C…...

C(九)while循环 --- 军训匕首操情景

匕首操&#xff0c;oi~oi~oi~~~~~ 接下来的几篇推文&#xff0c;杰哥记录的是三大循环结构的运行流程及其变式。 本篇的主角是while循环。&#x1f449; 目录&#xff1a; while循环 的组成、运行流程及其变式关键字break 和 continue 在while 循环中的作用while 循环的嵌套题目…...

C#秒如何转为时分秒格式

将秒数转换为分钟和秒数可以通过简单的数学运算来实现。假设你有一个整数表示秒数,可以通过以下方式转换为分钟: 将秒数除以 3600 来获取时钟的整数部分。 将秒数求余 3600的结果除以60 来获取分钟的整数部分。 用秒数求余 60 来获取余下的秒数。 具体实现函数如下: //…...

重学SpringBoot3-集成Redis(三)

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;三&#xff09; 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码&#xff1a;自定义过期策略 3. 配置…...

【Spine】引入PhotoshopToSpine脚本

引入 右键Photoshop图标&#xff0c;选择属性 打开文件所在位置 找到目录下的\Presets\Scripts文件夹。 找到Spine目录下的\scripts\photoshop文件夹下的PhotoshopToSpine.jsx 复制它&#xff0c;丢到Photoshop刚才找的那个目录下。 使用 打开.psd文件&#xff0c;检查不要…...

【Linux】详解Linux下的工具(内含yum指令和vim指令)

文章目录 前言1. Linux下软件安装的方式2. yum2.1 软件下载的小知识2.2 在自己的Linux系统下验证yum源的存在2.3 利用yum指令下载软件2.4 拓展yum源&#xff08;针对于虚拟机用户&#xff09; 3. vim编辑器3.1 vim是什么&#xff1f;3.2 如何打开vim3.2 vim各模式下的讲解3.2.1…...

MacBook 使用 brew 安装 MySQL

目录 &#xff08;1&#xff09;准备工作1.1 更新 brew &#xff08;2&#xff09;正式安装2.1 安装MySQL&#xff1a;2.2 启动mysql &#xff08;3&#xff09;初始化数据库3.1 选择验证密码组件3.2 密码强度3.3 删除匿名用户3.4 禁用root用户远程连接3.5 删除test数据库3.6 重…...

YOLOv8实时目标检测与自适应控制技术在游戏辅助系统中的应用研究

YOLOv8实时目标检测与自适应控制技术在游戏辅助系统中的应用研究 【免费下载链接】RookieAI_yolov8 基于yolov8实现的AI自瞄项目 AI self-aiming project based on yolov8 项目地址: https://gitcode.com/gh_mirrors/ro/RookieAI_yolov8 技术挑战剖析&#xff1a;实时游…...

深度解析:实战掌握神经网络架构可视化完整方案

深度解析&#xff1a;实战掌握神经网络架构可视化完整方案 【免费下载链接】Neural-Network-Architecture-Diagrams Diagrams for visualizing neural network architecture 项目地址: https://gitcode.com/gh_mirrors/ne/Neural-Network-Architecture-Diagrams 在深度学…...

垂直搜索选型避坑指南,为什么83%的企业在DeepSeek V2.1升级后节省了67%标注成本?

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;垂直搜索选型避坑指南&#xff0c;为什么83%的企业在DeepSeek V2.1升级后节省了67%标注成本&#xff1f; 垂直搜索系统选型绝非简单替换关键词引擎——它直击领域知识建模、语义对齐与标注闭环三大痛点。Deep…...

随心剪99.2分断层登顶!个人创作者AI剪辑工具权威评测TOP1

——基于800博主实测&#xff0c;30秒一键成片&#xff0c;1人顶5人&#xff0c;轻松实现日更爆款本次评测基于800美食、穿搭、知识、vlog等领域个人创作者的真实使用数据、出片效率复盘及深度访谈&#xff0c;覆盖一键成片速度、智能适配度、素材丰富度、操作便捷性四大核心维…...

在macOS上轻松运行Windows应用:Whisky完整使用指南

在macOS上轻松运行Windows应用&#xff1a;Whisky完整使用指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 想在Apple Silicon Mac上直接运行Windows软件和游戏&#xff0c;又不想…...

实习生,企业的青春代言人

为什么优质的口碑是招募最好的助推器&#xff1f; 在校园招聘中&#xff0c;应届生们不仅看官网的宣传&#xff0c;更看重学长学姐的“真实评价”。一份优质的校招实习经历&#xff0c;不仅能为企业培养出未来的中坚力量&#xff0c;更能通过学生的自发传播&#xff0c;让实习…...

避开这些坑:Tessent Shell中MBIST流程的DRC检查与调试指南

避开这些坑&#xff1a;Tessent Shell中MBIST流程的DRC检查与调试指南 在芯片设计领域&#xff0c;可测试性设计&#xff08;DFT&#xff09;是确保产品质量的关键环节。而作为DFT的重要组成部分&#xff0c;存储器内建自测试&#xff08;MBIST&#xff09;的实现质量直接影响着…...

从USB2.0到USB3.0:硬件工程师必须知道的电源管理与布线升级要点(含电平转换案例)

从USB2.0到USB3.0&#xff1a;硬件工程师必须掌握的电源管理与布线升级实战指南 在硬件设计领域&#xff0c;接口技术的迭代往往带来性能的飞跃&#xff0c;但同时也伴随着设计复杂度的显著提升。USB3.0作为当前主流的高速接口标准&#xff0c;其传输速率相比USB2.0提升了近10倍…...

Abiotic Factor多人生存建筑游戏《非生物因素》 专用服务器搭建教程

Abiotic Factor多人生存建筑游戏《非生物因素》 专用服务器搭建教程 Abiotic Factor 是由 Deep Field Games 开发、2024 年登陆 Steam 的科幻题材多人生存游戏。玩家扮演被困在地下高科技研究设施 GATE Cascade Research Facility 中的科学家&#xff0c;面对异生物入侵、次元裂…...

CANN/asc-devkit DeepNorm API 文档

DeepNorm 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/c…...