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);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/887122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 替换 yum源 经验分享

视频教程在bilibili:CentOS 替换 yum源 经验分享_哔哩哔哩_bilibili问题原因 解决方法 1. 进入镜像目录 [rootlocalhost ~]# cd /etc/yum.repos.d/ 2.备份文件 [rootlocalhost yum.repos.d]# rename repo bak * 3.寻找阿里镜像源复制 https://developer.aliyun.com/mirror/ …

Redis基础三(redis的高级配置)

Redis进阶配置 一、Redis持久化操作 ​ 持久化就是把内存的数据写到磁盘中去&#xff0c;防止服务宕机了内存数据丢失。&#xff08;Redis 数据都放在内存中。如果机器挂掉&#xff0c;内存的数据就不存在。所以需要做持久化&#xff0c;将内存中的数据保存在磁盘&#xff0c…

聊聊Mysql的MVCC

1 什么是MVCC&#xff1f; MVCC&#xff0c;是Multiversion Concurrency Control的缩写&#xff0c;翻译过来是多版本并发控制&#xff0c;和数据库锁一样&#xff0c;他也是一种并发控制的解决方案。 我们知道&#xff0c;在数据库中&#xff0c;对数据的操作主要有2种&#…

分享9个论文写作中强化观点三要素的奇技淫巧

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术写作中&#xff0c;强化观点的表达至关重要&#xff0c;它不仅能够提升论文的说服力&#xff0c;还能使论点更加明确和有力。为了帮助作者更有效地传达观点&#xff0c;本文将分享…

Leetcode 1631. 最小体力消耗路径

1.题目基本信息 1.1.题目描述 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights &#xff0c;其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) &#xff0c;且你希望去最右下角的格子 (rows-1, columns-1) &#x…

【Godot4.3】复合路径类myPath

概述 之前编写过一个基于指令绘图的类交myPoint&#xff0c;但是只涉及折线段生成。这次我基于SVG的<path>标签路径指令的启发&#xff0c;实现了一个能够获得连续绘制的直线段、圆弧和贝塞尔复合路径的类型myPath。 可以使用绘图指令方法或字符串形式的绘图指令解析来…

MATLAB|基于多主体主从博弈的区域综合能源系统低碳经济优化调度

目录 主要内容 程序亮点&#xff1a; 模型研究 一、综合能源模型 二、主从博弈框架 部分代码 结果一览 下载链接 主要内容 程序参考文献《基于多主体主从博弈的区域综合能源系统低碳经济优化调度》&#xff0c;采用了区域综合能源系统多主体博弈协同优化方…

【重学 MySQL】五十二、MySQL8 新特性:计算列

【重学 MySQL】五十二、MySQL8 新特性&#xff1a;计算列 定义特性用法应用场景注意事项 在MySQL8中&#xff0c;计算列是一项引入的新特性&#xff0c;它为数据处理和分析提供了更大的灵活性和便捷性。 定义 计算列是指根据数据库中其他列的值通过计算得出的新列&#xff0c…

反调试—1

IsDebuggerPresent() CheckRemoteDebuggerPresent() 其内部实际调用NtQueryInformationProcess() bool _stdcall ThreadCall() {while (true){BOOL pbDebuggerPresent FALSE;CheckRemoteDebuggerPresent(GetCurrentProcess(), &pbDebuggerPresent);if (pbDebuggerPres…

Leetcode: 0011-0020题速览

Leetcode: 0011-0020题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

【持续更新中】MMDetection3训练自己的数据集常见报错解决

博主近来跑自己数据集需要对比试验&#xff0c;故选择了MMDetection3这一算法整合详细的框架&#xff0c;遇到了较多问题在此处留作记录&#xff0c;若你也有相应的问题可以在评论区提出与解决方法。会持续更新&#xff0c;同时欢迎批评指正。 0.ModuleNotFoundError: No modu…

微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 小程序端…

索尼MDR-M1:超宽频的音频盛宴,打造沉浸式音乐体验

在音乐的世界里&#xff0c;每一次技术的突破都意味着全新的听觉体验。 索尼&#xff0c;作为音频技术的先锋&#xff0c;再次以其最新力作——MDR-M1封闭式监听耳机&#xff0c;引领了音乐界的新潮流。 这款耳机以其超宽频播放和卓越的隔音性能&#xff0c;为音乐爱好者和专…

多模态—图文匹配

可能最近大家已经发现了chatgpt可以根据自己的描述生成图片&#xff0c;其实这就是一个图文匹配的问题&#xff0c;可以理解为这是一个多模态的问题。 在模型训练时我们需要N个图片和N个文本对进行训练&#xff0c;文本通过text encoder形成文本语义向量&#xff0c;text enco…

【Python】Streamlit:为数据科学与机器学习打造的简易应用框架

Streamlit 是一个开源的 Python 库&#xff0c;专为数据科学家和机器学习开发者设计&#xff0c;旨在快速构建数据应用。通过简单的 Python 脚本&#xff0c;开发者无需掌握前端技术&#xff0c;即可将数据分析和模型结果转化为直观、交互式的 Web 应用。其简洁的 API 设计使得…

NVIDIA NVLink-C2C

NVIDIA NVLink-C2C 文章目录 前言一、介绍1. 用于定制芯片集成的超快芯片互连技术2. 构建半定制芯片设计3. 使用 NVLink-C2C 技术的产品 二、NVLink-C2C 技术优势1. 高带宽2. 低延迟3. 低功率和高密度4. 行业标准协议 前言 将 NVLink 扩展至芯片级集成 一、介绍 1. 用于定制芯…

软件设计师——数据结构

本博文所有内容来自于B站up主zst_2001 目录 时间复杂度 常规数据结构 链表 栈与队列 ​编辑 串 数组 树 卡特兰数&#xff1a; 平衡二叉树 哈夫曼 图 AOV 排序 顺序 折半 哈希 时间复杂度 常规数据结构 链表 栈与队列 串 找i位置前面的字符串&#xff0c…

Koa2+mongodb项目实战1(项目搭建)

前言 在正式开始之前&#xff0c;需要先知道用到的东西&#xff1a; koa&#xff1a;Koa 是一个基于 Node.js 的 Web 应用框架&#xff0c;非常适合开发API服务&#xff0c;可以与前端框架&#xff08;如 Vue.js、React.js&#xff09;结合使用&#xff0c;实现前后端分离的开…

【HTTP(3)】(状态码,https)

【认识状态码】 状态码最重要的目的&#xff0c;就是反馈给浏览器:这次请求是否成功&#xff0c;若失败&#xff0c;则出现失败原因 常见状态码: 200:OK&#xff0c;表示成功 404:Not Found&#xff0c;浏览器访问的资源在服务器上没有找到 403:Forbidden&#xff0c;访问被…

使用 Light Chaser 进行大屏数据可视化

引言 在当今数据驱动的世界中&#xff0c;数据可视化变得越来越重要。Light Chaser 是一款基于 React 技术栈的大屏数据可视化设计工具&#xff0c;通过简单的拖拽操作&#xff0c;你可以快速生成漂亮、美观的数据可视化大屏和看板。本文将介绍如何使用 Light Chaser 进行数据…