深入 C++ 线程库:从创建到同步的探索之旅
C++在<thread>中定义了C++线程库.
创建多线程
#include <iostream>
#include <thread>
using namespace std;
void show(int id, int count) { //线程函数for (int i = 0; i < count; ++i) {cout << "id:" << id << ",值:" << i << endl;}}
int main()
{thread t1(show, 1, 3);//创建线程对象t1thread t2(show, 2, 4);//创建线程对象t2t1.join();//必须使用join函数,否则线程结束会调用terminate()程序崩溃t2.join();//必须使用join函数,否则线程结束会调用terminate()程序崩溃cout << "main结束" << endl;return 0;
}
上面程序每次执行结果都不相同
获取线程返回值
如果需要获取线程的返回值,可以向线程传入一个保存结果的指针或者引用.不过这个一般不使用.
1.传指针
#include <iostream>
#include <thread>
using namespace std;
void show(int id,int count,int *v) {//线程函数for (int i = 0; i < count; ++i) {cout << "id:" << id << ",值:" << i << endl;*v += i;}}
int main() {int val1 = 0;//保存线程1返回值int val2 = 0;//保存线程2返回值thread t1(show, 1, 3,&val1);//创建线程对象t1thread t2(show, 2, 4,&val2);//创建线程对象t2t1.join();//必须使用join函数,否则线程结束会调用terminate()程序崩溃t2.join();//必须使用join函数,否则线程结束会调用terminate()程序崩溃cout << "val1=" << val1 << endl;cout << "val2=" << val2 << endl;cout << "main结束" << endl;return 0;
}
2.传引用
#include <iostream>
#include <thread>
using namespace std;
void show(int id,int count,int &v) {//线程函数for (int i = 0; i < count; ++i) {cout << "id:" << id << ",值:" << i << endl;v += i;}}
int main() {int val1 = 0;//保存线程1返回值int val2 = 0;//保存线程2返回值thread t1(show, 1, 3,ref(val1));//必须使用ref表明传递的引用thread t2(show, 2, 4,ref(val2)); t1.join();//必须使用join函数,否则线程结束会调用terminate()程序崩溃t2.join();//必须使用join函数,否则线程结束会调用terminate()程序崩溃cout << "val1=" << val1 << endl;cout << "val2=" << val2 << endl;cout << "main结束" << endl;return 0;
}
原子操作
下面的代码,不能实现想要的增加(val的结果是错误的).
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
void increment(int& v)//对v进行增加操作
{for (int i = 0; i < 100000; i++)//这个次数少可能没有问题,因为电脑速度太快++v;
}int main()
{int val = 0;vector<thread>vec;//保存线程的容器for (int i = 0; i < 10; ++i)vec.push_back(thread(increment,ref(val)));for (auto& x : vec)x.join();cout << "val=" << val << endl;return 0;
}
原子类型允许原子访问,这意味着不需要额外的同步机制就可以执行并发的读写操作.
需要引用<atomic>
下面是把上面的代码加了原子操作
#include <iostream>
#include <thread>
#include <vector>
#include <atomic>//原子操作库
using namespace std;void increment(atomic<int>& v)//对v进行增加操作
{for (int i = 0; i < 100000; i++)++v;
}int main()
{atomic<int> val = 0;vector<thread>vec;//保存线程的容器for (int i = 0; i < 10; ++i)vec.push_back(thread(increment, ref(val)));for (auto& x : vec)x.join();cout << "val=" << val << endl;return 0;
}
互斥量
标准库<mutex>提供互斥量(也称互斥锁),它可以实现线程间的同步.
互斥量(Mutex)的基本概念
互斥量(互斥锁)是一种用于保护共享资源的同步原语。在多线程环境中,多个线程可能会同时访问和修改共享资源,这可能导致数据竞争(Data Race),即多个线程在没有适当同步的情况下同时读写同一块内存区域,从而导致程序出现未定义行为。互斥量通过提供互斥访问的机制来解决这个问题,它确保在同一时刻只有一个线程能够访问被保护的共享资源。
原语通常指的是在操作系统、数据库或并发编程等领域中,由若干条指令组成的、用于完成一定功能的一个过程或操作。这些原语通常是不可分割的,即执行过程中不允许被中断,以保证操作的原子性和正确性。
mutex类型介绍
在 C++ 标准库中,mutex是最基本也是使用最多的互斥量类型。它提供了lock和unlock两个基本成员函数。
- lock函数:获取互斥量的锁,从而可以访问被保护的共享资源。如果互斥量已经被其他线程锁定,那么调用lock函数的线程将会阻塞,直到互斥量被解锁。
- unlock函数:当一个线程完成对共享资源的访问后,需要调用unlock函数来释放互斥量的锁,这样其他等待的线程才有机会获取锁并访问共享资源。
注意:这两个函数不建议直接使用,容易出现死锁.可使用后面的方式.
mutex有可以分为两大类非定时互斥量和定时互斥量(增加一个超时放弃属性).其中非定时包括mutex,recursive_mutex(递归的),shared_mutex,定时包括timed_mutex,recursive_timed_mutex,shared_timed_mutex.
锁的类型
互斥锁(Mutex)
原理:互斥锁是最常见的一种锁,用于保护共享资源。它的核心原理是在同一时刻只允许一个线程访问被保护的资源。当一个线程获取了互斥锁后,其他线程如果想要访问该资源,就必须等待锁被释放。互斥锁通过阻塞其他线程来实现对共享资源的独占访问。
自旋锁(Spin Lock)
原理:自旋锁在获取锁时,如果锁已被占用,线程不会阻塞,而是在一个循环中不断地检查锁是否可用。它是基于原子操作实现的,通过循环等待的方式来获取锁。
读写锁(Read - Write Lock)
原理:读写锁允许同时有多个线程对共享资源进行读操作,但在有线程进行写操作时,其他线程(无论是读还是写)都必须等待。读写锁的状态通常分为读模式和写模式。当一个线程以读模式获取锁后,其他线程仍然可以以读模式获取锁,但不能以写模式获取锁;当一个线程以写模式获取锁后,其他线程都不能获取锁。
互斥锁和自旋锁的区别
定义与工作原理
自旋锁(Spin Lock)
- 定义:自旋锁是一种轻量级锁机制。
- 工作原理:当线程尝试获取一个已被占用的自旋锁时,它不会立即放弃CPU,而是原地循环(自旋),不断检查锁的状态,直到锁变为可用。这种机制避免了上下文切换的开销,但如果等待时间较长,会持续占用CPU资源。(类似食堂打快餐排队)
互斥锁(Mutex)
- 定义:互斥锁是最常用的线程间同步机制,具有互斥性和互锁性。
- 工作原理:当一个线程试图锁定一个已经被其他线程持有的互斥锁时,该线程会被操作系统挂起(进入睡眠状态),并从运行队列中移除,直到锁被释放,操作系统才会唤醒该线程,将其放回运行队列。这个过程涉及上下文切换,有一定的系统开销。(类似食堂吃麻辣烫拿号码牌排队)
性能特性
自旋锁
- 优点:在等待时间较短时,可以避免上下文切换的开销,提高效率。
- 缺点:如果等待时间较长,持续占用CPU的自旋会成为性能瓶颈,浪费CPU资源。
互斥锁
- 优点:在锁等待时间较长时,可以让出CPU资源,避免资源浪费。
- 缺点:在获取锁失败时会引入较高的上下文切换开销。此外,互斥锁还可能导致优先级反转问题,即高优先级线程可能因等待低优先级线程释放锁而被延迟。
适用场景
自旋锁
- 适用于锁的持有时间很短,以及CPU核心较少的环境。因为自旋会占用CPU,如果锁的等待时间过长,会浪费CPU资源,降低整体效率。
- 通常用于内核空间,特别是中断处理程序中,因为在中断上下文中不能休眠。
互斥锁
- 适用于锁的持有时间不确定或可能较长的情况。由于它会导致线程阻塞,适用于用户态程序和不需要高响应速度的场合。
简单的使用示例
以下是一个简单的示例,展示了如何使用std::mutex来保护共享资源: 警告:这是一个简单,但并不好的例子,不要去调用lock和unlock函数,容易出现死锁.后面有更好的方式.
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
using namespace std;mutex mtx;//互斥锁对象void increment(int& v)//对v进行增加操作
{for (int i = 0; i < 100000; i++){mtx.lock();//加锁++v;mtx.unlock();//开锁}
}int main()
{int val = 0;vector<thread>vec;//保存线程的容器for (int i = 0; i < 10; ++i)vec.push_back(thread(increment, ref(val)));for (auto& x : vec)x.join();cout << "val=" << val << endl;return 0;
}
更好用的示例
unique_lock是 C++ 标准库中用于管理互斥量(mutex)的模板类,它的析构函数会自动释放所关联的互斥量.
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
using namespace std;mutex mtx;//互斥锁对象void increment(int& v)//对v进行增加操作
{for (int i = 0; i < 100000; i++){unique_lock<mutex> lock(mtx);//自动加锁,生命周期结束后自动解锁++v;}
}int main()
{int val = 0;vector<thread>vec;//保存线程的容器for (int i = 0; i < 10; ++i)vec.push_back(thread(increment, ref(val)));for (auto& x : vec)x.join();cout << "val=" << val << endl;return 0;
}
一个更全面的例子
顺序执行每个线程5次.
#include <iostream>
#include <thread>
#include <string>
#include <mutex>
#include <condition_variable>
using namespace std;mutex mtx; //互斥量
condition_variable cv;//条件变量
int current_thread = 1; // 当前需要执行的线程编号//线程编号和输出的信息
void print(int thread_id, const string& message) {for (int i = 0; i < 5; ++i) { // 每个线程打印5次unique_lock<mutex> lock(mtx);//加锁//阻塞,直到条件为真cv.wait(lock, [&]() { return current_thread == thread_id; }); // 等待当前线程是指定线程cout << message << endl;//打印相应数据current_thread = thread_id % 3 + 1; // 切换到下一个线程(1 -> 2 -> 3)cv.notify_all(); // 唤醒其他线程}
}int main() {thread t1(print, 1, "Thread 1");//创建线程1thread t2(print, 2, "Thread 2");//创建线程2thread t3(print, 3, "Thread 3");//创建线程3t1.join();t2.join();t3.join();return 0;
}
相关文章:
深入 C++ 线程库:从创建到同步的探索之旅
C在<thread>中定义了C线程库. 创建多线程 #include <iostream> #include <thread> using namespace std; void show(int id, int count) { //线程函数for (int i 0; i < count; i) {cout << "id:" << id << ",值:&qu…...
LangChain使用大语言模型构建强大的应用程序
LangChain简介 LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互ÿ…...
程序化广告行业(72/89):Tag Manager系统代码操作与行业发展剖析
程序化广告行业(72/89):Tag Manager系统代码操作与行业发展剖析 大家好!在技术领域不断探索的过程中,我深刻体会到知识共享的重要性。写这篇博客,就是希望能和大家一起深入了解程序化广告行业,…...
数据结构实验3.3:求解迷宫路径问题
文章目录 一,问题描述二,基本要求三,算法分析(一)整体思路(二)详细步骤1. 输入迷宫大小并生成迷宫2. 定义走步规则3. 深度优先搜索(DFS)4. 输出结果 (三&…...
基于SpringBoot的线上历史馆藏系统【附源码】
基于SpringBoot的线上历史馆藏系统(源码L文说明文档) 4 系统设计 系统在设计的过程中,必然要遵循一定的原则才可以,胡乱设计是不可取的。首先用户在使用过程中,能够直观感受到功能操作的便利性,符合…...
Mybatis的springboot项目使用
删除数据 & 占位符 一般常用占位符进行数据库操作,也就是预编译sql。 在UserMapper中定义删除接口 /** 根据id删除用户*/ Delete("delete from user where id #{id}") void deleteById(Integer id);若想要获取返回值,声明为Integer (s…...
网站集群批量管理-Ansible剧本与变量
复盘内容:链接指北 查看ansible命令文档 ansible-doc -s systemd一、剧本 何为剧本: playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量 剧本yaml格式,yaml格式的文件:空格,冒号. 剧本未来我们批量管理,运维必会的内容. …...
HOW - React Developer Tools 调试器
目录 React Developer Tools使用Components 功能特性1. 查看和编辑 props/state/hooks2. 查找组件3. 检查组件树4. 打印组件信息5. 检查子组件 Profiler 功能特性Commit ChartFlame Chart 火焰图Ranked Chart 排名图 why-did-you-render 参考文档: React调试利器&a…...
Spring Cloud Alibaba微服务治理实战:Nacos+Sentinel深度解析
一、引言 在微服务架构中,服务发现、配置管理、流量控制是保障系统稳定性的核心问题。Spring Cloud Netflix 生态曾主导微服务解决方案,但其部分组件(如 Eureka、Hystrix)已进入维护模式。 Spring Cloud Alibaba 凭借 高性能、轻…...
《AI换脸时代的攻防暗战:从技术滥用走向可信未来》
技术迭代图谱 过去五年里,Deepfake技术经历了飞速迭代,从最初的萌芽到如今的广泛应用和对抗措施形成。2017年前后,利用深度学习进行人脸换装的技术首次在社区中出现。一位Reddit网友昵称“deepfakes”,将名人面孔替换到色情影片上…...
25/4/9 算法笔记 DBGAN+强化学习+迁移学习实现青光眼图像去模糊1
整体实验介绍 实验主要是结合DBGAN对抗网络强化学习增强迁移学习增强实现青光眼图像去模糊。今天则是先完成了DBGAN板块模型的训练。 实验背景介绍 青光眼的主要特征有: 视盘形态与杯盘比CDR:青光眼患者主要表现为视杯扩大,盘沿变窄。 视…...
【Claude AI大语言模型连接Blender生成资产】Windows安装Blender MCP教程
前言 最近在学习资产制作,了解到了个好玩的东西,利用AI一步一步搭建资产: 上面这副图就是利用Claude AI调用Blender的Python接口一步一步实现的,挺丑但好玩。 安装教程 进入Github: Blender-MCP 网站,下载该项目&a…...
JSP运行环境安装及常用HTML标记使用
制作一个静态网站的基本页面index.html 实验代码:<form> <label for"username">用户名:</label> <input type"text" id"username" name"username"><br> <label for"password&…...
Git 的进阶功能和技巧
1、分支的概念和使用 1.1、什么是分支? 分支(Branch)是在版本控制中非常重要的概念。几乎所有版本控制系统都支持某种形式的分支。在 Git 中,分支是 Git 强大功能之一,它允许我们从主开发线分离出来,在不…...
WSL1升级到WSL2注意事项
今天要在WSL上安装docker,因为机器上安装了wsl1,docker安装后启动不了,通过询问deepseek发现docker只能在wsl2上安装,因此就想着将本机的wsl1升级到wsl2。 确保你的 Windows 系统是 Windows 10(版本 1903 及以上&…...
392. 判断子序列
https://leetcode.cn/problems/is-subsequence/?envTypestudy-plan-v2&envIdtop-interview-150因为是子序列我们只要关心后一个字符在前一个字符后面出现过就行,至于在哪出现出现几次我们不关心,所以我们可以用HashMap<Character, ArrayList<…...
在 VMware 中为 Ubuntu 24.04 虚拟机设置共享文件夹后,在虚拟机中未能看到共享的内容
在 VMware 中为 Ubuntu 24.04 虚拟机设置共享文件夹后,如果在虚拟机中未能看到共享的内容,可能是由于以下原因: VMware Tools 未正确安装:共享文件夹功能依赖于 VMware Tools 或 Open VM Tools。如果未安装或安装不完整࿰…...
台式电脑插入耳机没有声音或麦克风不管用
目录 一、如何确定插孔对应功能1.常见音频插孔颜色及功能2.如何确认电脑插孔?3.常见问题二、 解决方案1. 检查耳机连接和设备选择2. 检查音量设置和静音状态3. 更新或重新安装声卡驱动4. 检查默认音频格式5. 禁用音频增强功能6. 排查硬件问题7. 检查系统服务8. BIOS设置(可选…...
Windchill开发-WTContainer相关API整理
Windchill开发-WTContainer相关API整理 概述各容器对象相关方法站点容器组织容器产品容器/存储库容器上下文团队角色组 文件夹 方法汇总 概述 Windchill 的环境由一组容器组成,容器分为三级:第一级为站点容器,第二级为组织容器,第…...
理解JSON-RPC 2.0 协议
JSON-RPC 2.0是指一种基于 JSON 的远程过程调用协议,用于在网络上进行跨平台和跨语言的通信。它提供了一种简单、轻量级的方式来实现客户端和服务器之间的方法调用和数据交换。在原文中,JSON-RPC 2.0被用来描述 STDIO 传输机制中消息的格式,即…...
【 C# 使用 MiniExcel 库的典型场景】
以下是 C# 使用 MiniExcel 库的典型场景及代码示例: 一、基础读取操作 强类型读取(需定义数据模型类) 定义与 Excel 列名匹配的类后直接映射为对象集合: csharp Copy Code public class UserAccount { public int Id { get; …...
创建 Pod 失败,运行时报错 no space left on device?
遇到创建Pod失败并报错“no space left on device”时,请按照以下步骤排查和解决问题: 1. 定位问题来源 查看Pod事件: kubectl describe pod <pod-name> -n <namespace> 在输出中查找 Events 部分,确认错误是否与…...
[leetcode]查询区间内的所有素数
一.暴力求解 #include<iostream> #include<vector> using namespace std; vector<int> result; bool isPrime(int i) { if (i < 2) return false; for (int j 2;j * j < i;j) { if (i % j 0) { …...
【Web安全】如何在 CDN 干扰下精准检测 SSRF?Nuclei + Interactsh 实战
❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 背景 在日常漏洞复核中,我们常用 DNSLog 平台判断目标是否存在 SSRF 漏洞:只要请…...
输入框只能输入非中文字符
在 Qt 中,可以通过设置输入法过滤器(QInputContext)或使用正则表达式来限制输入框(QLineEdit 或 QTextEdit)只能输入非中文字符。以下是两种实现方法: ### 方法 1:使用正则表达式 可以通过 QLi…...
LeeCode 136. 只出现一次的数字
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入࿱…...
Traefik应用:配置容器多个网络时无法访问问题
Traefik应用:配置容器多个网络时无法访问问题 介绍解决方法问题原因: **容器多网络归属导致 Traefik 无法正确发现路由规则**。解决方案方法 1:将应用容器 **仅连接** 到 traefik-public 网络方法 2:显式指定 Traefik 监听的网络 …...
超便捷超实用的文档处理工具,PDF排序,功能强大,应用广泛,无需下载,在线使用,简单易用快捷!
小白工具https://www.xiaobaitool.net/files/pdf-sort/ 中的 PDF 排序功能是一项便捷实用的文档处理服务,以下是其具体介绍: 操作便捷直观:用户上传 PDF 文件后,可通过直接拖动页面缩略图来调整顺序,就像在纸质文档中…...
zsh: command not found - 鸿蒙 HarmonyOS Next
终端中执行 hdc 命令抛出如下错误; zsh: command not found 解决办法 首先,查找到 DevEco-Studio 的 toolchains 目录路径; 其次,按照类似如下的文件夹层级结果推理到 toolchains 子级路径下,其中 sdk 后一级的路径可能会存在差异,以实际本地路径结构为主,直至找到 openharm…...
【动态规划】 深入动态规划—两个数组的dp问题
文章目录 前言例题一、最长公共子序列二、不相交的线三、不同的子序列四、通配符匹配五、交错字符串六、两个字符串的最小ASCII删除和七、最长重复子数组 结语 前言 问题本质 它主要围绕着给定的两个数组展开,旨在通过对这两个数组元素间关系的分析,找出…...
金融数据分析(Python)个人学习笔记(7):网络数据采集以及FNN分类
一、网络数据采集 证券宝是一个免费、开源的证券数据平台(无需注册),提供大盘准确、完整的证券历史行情数据、上市公司财务数据等,通过python API获取证券数据信息。 1. 安装并导入第三方依赖库 baostock 在命令提示符中运行&…...
指定运行级别
linux系统下有7种运行级别,我们需要来了解一下常用的运行级别,方便我们熟悉以后的部署环境,话不多说,来看. 开机流程: 指定数级别 基本介绍 运行级别说明: 0:关机 相当于shutdown -h now ⭐️默认参数不能设置为0,否则系统无法正常启动 1:单用户(用于找回丢…...
7.第二阶段x64游戏实战-string类
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:7.第二阶段x64游戏实战-分析人物属性 string类是字符串类,在计算机中…...
【MySQL基础】左右连接实战:掌握数据关联的完整视图
1 左右连接基础概念 左连接(left join)和右连接(right join)是MySQL中两种重要的表连接方式,它们与内连接不同,能够保留不匹配的记录,为我们提供更完整的数据视图。 核心区别: left join:保留左表所有记录,…...
建筑工程行业如何选OA系统?4大主流产品分析
工程行业项目的复杂性与业务流程的繁琐性对办公效率提出了极高要求。而OA 系统(办公自动化系统)的出现,为工程企业提供了一种全新的、高效的管理模式。 工程行业OA系统选型关键指标 功能深度:项目管理模块完整度、文档版本控制能…...
动态科技感html导航网站源码
源码介绍 动态科技感html导航网站源码,这个设计完美呈现了科幻电影中的未来科技界面效果,适合展示技术类项目或作为个人作品集的入口页面,自适应手机。 修改卡片中的链接指向你实际的HTML文件可以根据需要调整卡片内容、图标和颜色要添加更…...
CLIPGaze: Zero-Shot Goal-Directed ScanpathPrediction Using CLIP
摘要 目标导向的扫描路径预测旨在预测人们在搜索视觉场景中的目标时的视线移动路径。大多数现有的目标导向扫描路径预测方法在面对训练过程中未出现的目标类别时,泛化能力较差。此外,它们通常采用不同的预训练模型分别提取目标提示和图像的特征,导致两者之间存在较大的特征…...
wsl-docker环境下启动ES报错vm.max_map_count [65530] is too low
问题描述 在windows环境下用Docker Desktop(wsl docker)启动 elasticsearch时报错 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]解决方案 方案一 默认的vm.max_map_count值是65530,而es需要至少262…...
js chrome 插件,下载微博视频
起因, 目的: 最初是想下载微博上的NBA视频,因为在看网页上看视频很不方便,快进一次是10秒,而本地 VLC 播放器,快进一次是5秒。另外我还想做点视频剪辑。 对比 原来手动下载的话,右键检查,复制…...
游戏引擎学习第212天
"我们将同步…"α 之前我们有一些内容是暂时搁置的,因为在调整代码的过程中,我们做了一些变动以使代码更加简洁,这样可以把数据放入调试缓冲区并显示出来,这一切现在看起来已经好多了。尽管现在看起来更好,…...
PXE远程安装服务器
目录 搭建PXE远程安装服务器 1、准备Linux安装源: 2、安装并启用TFTP服务: 3、准备Linux内核、初始化镜像文件 4、准备PXE引导程序 5、安装并启用DHCP服务 6、(1)配置启动菜单文件(有人应答) 6、(2)…...
软件测试之功能测试详解
一、测试项目启动与研读需求文档 (一) 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中所有的问题。 督促和协助开发人员尽快地解决程序中的缺陷。 帮助项目管理人员制定合理的开发和测试计划。 对缺陷进行…...
Python深度学习基础——卷积神经网络(CNN)(PyTorch)
CNN原理 从DNN到CNN 卷积层与汇聚 深度神经网络DNN中,相邻层的所有神经元之间都有连接,这叫全连接;卷积神经网络 CNN 中,新增了卷积层(Convolution)与汇聚(Pooling)。DNN 的全连接…...
pytorch 反向传播
文章目录 概念计算图自动求导的两种模式 自动求导-代码标量的反向传播非标量变量的反向传播将某些计算移动到计算图之外 概念 核心:链式法则 深度学习框架通过自动计算导数(自动微分)来加快求导。 实践中,根据涉及号的模型,系统会构建一个计…...
VSCode解决中文乱码方法
目录 一、底层原因 二、解决方法原理 三、解决方式: 1.预设更改cmd临时编码法 2.安装插件法: 一、底层原因 当在VSCode中遇到中文显示乱码的问题时,这通常是由于文件编码与VSCode的默认或设置编码不匹配,或…...
pandas.DataFrame.dtypes--查看和验证 DataFrame 列的数据类型!
查看每列的数据类型,方便分析是否需要数据类型转换 property DataFrame.dtypes[source] Return the dtypes in the DataFrame. This returns a Series with the data type of each column. The result’s index is the original DataFrame’s columns. Columns with…...
高性能服务开发利器:redis+lua
Redis 与 Lua 脚本的结合,其核心价值在于 原子性操作 和 减少网络开销。 一、Redis 执行 Lua 脚本的优势 原子性 Lua 脚本在 Redis 中原子执行,避免多命令竞态条件。 减少网络开销 将多个 Redis 命令合并为一个脚本,减少客…...
开源智能体MetaGPT记忆模块解读
MetaGPT 智能体框架 1. 框架概述 MetaGPT 是一个多智能体协作框架,通过模拟软件公司组织架构与工作流程,将大语言模型(LLM)转化为具备专业分工的智能体,协同完成复杂任务。其最大特点是能够将自然语言需…...
Docker部署MySQL大小写不敏感配置与数据迁移实战20250409
Docker部署MySQL大小写不敏感配置与数据迁移实战 🧭 引言 在企业实际应用中,尤其是使用Java、Hibernate等框架开发的系统,MySQL默认的大小写敏感特性容易引发各种兼容性问题。特别是在Linux系统中部署Docker版MySQL时,默认行为可…...
【RabbitMQ】延迟队列
1.概述 延迟队列其实就是队列里的消息是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。 延时队列的使用场景: 1.订单在十分钟之内未支付则自动取消 2.新创建的店铺,…...