【DeepSeek 学C++】std::atomic 用于线程控制,和内存强顺序一致性
std::atomic<bool> workerTerminate_{};
std::atomic<bool> workerTerminate_{};
是一个原子布尔变量的声明,变量名为 workerTerminate_
。这种变量通常用于多线程编程中,用来控制或通知工作线程的终止。使用 std::atomic
可以确保对该变量的访问是线程安全的,即多个线程对 workerTerminate_
的操作不会发生数据竞争,并且能够正确同步。
关键点
-
原子性:
std::atomic<bool>
保证对workerTerminate_
的操作是原子的。这意味着不会有两个线程同时修改或读取workerTerminate_
,从而避免了竞争条件。
-
线程安全:
- 由于
workerTerminate_
是原子的,多个线程可以安全地检查或修改它的值,而不需要额外的同步机制(如互斥锁)。
- 由于
-
典型用途:
- 这种变量通常用作一个标志,用来通知工作线程停止执行。例如:
std::atomic<bool> workerTerminate_{false};void workerThread() {while (!workerTerminate_.load()) {// 执行任务} }void stopWorker() {workerTerminate_.store(true); }
- 在这个例子中,
workerThread
会一直运行,直到另一个线程调用stopWorker
将workerTerminate_
设置为true
。
- 这种变量通常用作一个标志,用来通知工作线程停止执行。例如:
-
内存顺序:
- 默认情况下,
std::atomic
的操作使用顺序一致性(最强的内存顺序)。但你也可以根据需要指定其他内存顺序(如std::memory_order_relaxed
),以在某些场景下优化性能。
- 默认情况下,
示例代码
#include <atomic>
#include <thread>
#include <iostream>std::atomic<bool> workerTerminate_{false};void workerThread() {while (!workerTerminate_.load()) {std::cout << "工作中..." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));}std::cout << "工作线程已终止。" << std::endl;
}int main() {std::thread worker(workerThread);// 让工作线程运行一段时间std::this_thread::sleep_for(std::chrono::seconds(5));// 通知工作线程终止workerTerminate_.store(true);// 等待工作线程结束worker.join();return 0;
}
代码解释
-
workerThread 函数在一个循环中运行,每隔 1 秒打印一次 “工作中…”,直到 workerTerminate_ 被设置为
true。 -
main 函数创建了工作线程,让它运行 5 秒,然后通过将 workerTerminate_ 设置为 true 来通知线程终止。
-
工作线程在每次循环中检查 workerTerminate_ 的值,当发现其为 true 时退出循环并结束线程。
总结
std::atomic<bool>
是一种非常常用的多线程编程工具,特别适合用来实现线程间的简单通信(如终止信号)。它的原子性和线程安全性使得开发者无需额外使用锁或其他同步机制,从而简化了代码并提高了性能。
std::atomic<bool>
的操作使用顺序一致性(最强的内存顺序)
std::atomic<bool>
的操作默认使用**顺序一致性(Sequential Consistency,简称 SC)**的内存顺序。这是最严格的内存顺序模型,它保证了多线程程序的行为符合一种直观的、全局一致的顺序。
什么是顺序一致性?
顺序一致性可以理解为:
- 所有线程看到的操作顺序是一致的:即所有线程对内存的操作(读/写)看起来是按照某种全局顺序执行的。
- 每个线程的内部操作顺序保持不变: 即每个线程内部的代码执行顺序不会被重排。
换句话说,顺序一致性保证了多线程程序的行为就像所有线程的操作被串行化(一个接一个地执行)一样,且每个线程的操作顺序与代码中的顺序一致。
为什么顺序一致性是最强的内存顺序?
顺序一致性提供了最强的保证,因为它:
- 避免了指令重排(编译器或 CPU 不会对操作进行优化重排)
- 确保了所有线程对内存的修改是全局可见的,且顺序一致。
这种严格的保证使得程序的行为更容易理解和推理,但可能会牺牲一些性能。
举例说明
假设有两个线程,线程 A 和线程 B,它们分别修改和读取两个原子变量 x 和 y:
#include <atomic>
#include <thread>
#include <iostream>std::atomic<int> x{0};
std::atomic<int> y{0};
int r1, r2;void threadA() {x.store(1); // 操作 1r1 = y.load(); // 操作 2
}void threadB() {y.store(1); // 操作 3r2 = x.load(); // 操作 4
}int main() {std::thread t1(threadA);std::thread t2(threadB);t1.join();t2.join();std::cout << "r1 = " << r1 << ", r2 = " << r2 << std::endl;return 0;
}
顺序一致性的行为
在顺序一致性模型下,所有线程看到的操作顺序是一致的。可能的执行顺序包括:
-
线程 A 先执行,线程 B 后执行:
- 操作 1:x = 1
- 操作 2:r1 = y(此时 y 仍然是 0,所以 r1 = 0)
- 操作 3:y = 1
- 操作 4:r2 = x(此时 x 已经是 1,所以 r2 = 1)
- 结果:r1 = 0, r2 = 1
-
线程 B 先执行,线程 A 后执行:
-
操作 3:y = 1
-
操作 4:r2 = x(此时 x 仍然是 0,所以 r2 = 0)
-
操作 1:x = 1
-
操作 2:r1 = y(此时 y 已经是 1,所以 r1 = 1)
-
结果:r1 = 1, r2 = 0
-
-
操作交错执行
-
操作 1:x = 1
-
操作 3:y = 1
-
操作 2:r1 = y(此时 y 已经是 1,所以 r1 = 1)
-
操作 4:r2 = x(此时 x 已经是 1,所以 r2 = 1)
-
结果:r1 = 1, r2 = 1
-
在顺序一致性模型下,不可能出现 r1 = 0, r2 = 0 的情况,因为所有线程看到的操作顺序是一致的。
如果使用更弱的内存顺序会怎样?
如果使用更弱的内存顺序(如 std::memory_order_relaxed),编译器和 CPU 可能会对操作进行重排,导致一些违反直觉的结果。例如:
-
线程 A 的操作 2(r1 = y)可能会在操作 1(x = 1)之前执行。
-
线程 B 的操作 4(r2 = x)可能会在操作 3(y = 1)之前执行。
这样可能会导致 r1 = 0, r2 = 0 的结果,因为两个线程都读取到了未更新的值。
总结
顺序一致性是最强的内存顺序模型,保证了多线程程序的行为符合一种全局一致的顺序。
它避免了指令重排,并确保所有线程对内存的修改是全局可见的。
顺序一致性虽然易于理解和推理,但可能会牺牲一些性能。
在需要更高性能的场景中,可以使用更弱的内存顺序(如 std::memory_order_relaxed),但需要更谨慎地处理同步问题。
使用 std::memory_order_relaxed 的代码示例
std::memory_order_relaxed 是最弱的内存顺序模型,它只保证原子操作的原子性,但不提供任何同步或顺序保证。这意味着编译器和 CPU 可以自由地对操作进行重排,只要保证原子操作本身的原子性即可。
使用 std::memory_order_relaxed 可以提高性能,但需要开发者非常小心,因为程序的执行顺序可能会变得难以预测。
#include <atomic>
#include <thread>
#include <iostream>std::atomic<int> x{0};
std::atomic<int> y{0};
int r1, r2;void threadA() {x.store(1, std::memory_order_relaxed); // 操作 1r1 = y.load(std::memory_order_relaxed); // 操作 2
}void threadB() {y.store(1, std::memory_order_relaxed); // 操作 3r2 = x.load(std::memory_order_relaxed); // 操作 4
}int main() {std::thread t1(threadA);std::thread t2(threadB);t1.join();t2.join();std::cout << "r1 = " << r1 << ", r2 = " << r2 << std::endl;return 0;
}
可能的结果
由于使用了 std::memory_order_relaxed,编译器和 CPU 可能会对操作进行重排。因此,以下结果都是可能的:
-
r1 = 0, r2 = 1
-
r1 = 1, r2 = 0
-
r1 = 1, r2 = 1
-
r1 = 0, r2 = 0(这是顺序一致性模型下不可能出现的结果)
为什么会出现 r1 = 0, r2 = 0?
在 std::memory_order_relaxed 下,编译器和 CPU 可能会对操作进行重排。例如:
-
线程 A 的操作 2(r1 = y)可能会在操作 1(x = 1)之前执行。
-
线程 B 的操作 4(r2 = x)可能会在操作 3(y = 1)之前执行。
这样,两个线程都读取到了未更新的值,导致 r1 = 0, r2 = 0。
更复杂的例子:使用 std::memory_order_relaxed 实现简单的计数器
以下是一个使用 std::memory_order_relaxed 实现计数器的例子:
#include <atomic>
#include <thread>
#include <vector>
#include <iostream>std::atomic<int> counter{0};void incrementCounter(int iterations) {for (int i = 0; i < iterations; ++i) {counter.fetch_add(1, std::memory_order_relaxed);}
}int main() {const int numThreads = 10;const int iterationsPerThread = 10000;std::vector<std::thread> threads;for (int i = 0; i < numThreads; ++i) {threads.emplace_back(incrementCounter, iterationsPerThread);}for (auto& t : threads) {t.join();}std::cout << "Final counter value: " << counter.load(std::memory_order_relaxed) << std::endl;return 0;
}
代码解释
- counter.fetch_add(1, std::memory_order_relaxed):
- 使用 std::memory_order_relaxed 对计数器进行原子加 1 操作。 由于是 relaxed
- 模式,其他线程可能不会立即看到计数器的更新。
2 .多线程累加:
-
10 个线程并发执行,每个线程对计数器累加 10000 次。
-
最终计数器的值应该是 10 * 10000 = 100000。
- 结果:
-
由于 std::memory_order_relaxed 只保证原子性,不保证顺序,因此其他线程可能会看到计数器的中间状态。
-
但最终结果仍然是正确的,因为 fetch_add 是原子的。
相关文章:
【DeepSeek 学C++】std::atomic 用于线程控制,和内存强顺序一致性
std::atomic<bool> workerTerminate_{}; std::atomic<bool> workerTerminate_{}; 是一个原子布尔变量的声明,变量名为 workerTerminate_。这种变量通常用于多线程编程中,用来控制或通知工作线程的终止。使用 std::atomic 可以确保对该变量的…...
计算存储一幅大小为 1024×10241024×1024、256 灰度级的图像所需的字节数
1. 图像的基本信息 图像分辨率:1024102410241024,表示图像有 1024 行和 1024 列,总像素数为: 102410241,048,576 像素102410241,048,576 像素 灰度级:256 灰度级,表示每个像素的灰度值可以用 256 个不同的值…...
Flutter 网络请求与数据处理:从基础到单例封装
Flutter 网络请求与数据处理:从基础到单例封装 在 Flutter 开发中,网络请求是一个非常常见的需求,比如获取 API 数据、上传文件、处理分页加载等。为了高效地处理网络请求和数据管理,我们需要选择合适的工具并进行合理的封装。 …...
从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用
嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下,传统的视频观看方式依赖于微软的OCX控件,然而OCX控件的使用正面临越来越多的挑战: 首先,用户需要安装浏览器插件、调整浏览器安全级别,并允许ActiveX控件弹出…...
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300的秘密武器
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 企业级应用开发的需求日益增长。今天,我们要介绍的是一个在GitHub上广受好评的开源项目——Jeesite5。这不仅是一个技术框架,更…...
C++(23):lambda可以省略()
C越来越多的使用了lambda,C23也进一步的放宽了对lambda的限制,这一次,如果lambda没有参数列表,那么可以直接省略掉(): #include <iostream> using namespace std;void func() {auto f []{cout<<"in…...
vue3之echarts柱状图-圆锥加自动轮播
vue3之echarts柱状图-圆锥加自动轮播 效果: 版本 "echarts": "5.4.2" 核心代码: <template><div ref"echartRef" class"chart"></div><svg><linearGradient v-for"(item, i…...
Qt中利用httplib调用https接口
httplib中如果要调用https接口,需要开启OPENSSL支持,经过半天坑爹得摸索,总结下经验。 1,下载 并安装Win64OpenSSL 地址如下,我Qt版本是5.15.2 ,openssl选择的是 64位(Win64OpenSSL-3_3_3.msi…...
深度学习04 数据增强、调整学习率
目录 数据增强 常用的数据增强方法 调整学习率 学习率 调整学习率 调整学习率的方法 有序调整 等间隔调整 多间隔调整 指数衰减 余弦退火 自适应调整 自定义调整 数据增强 数据增强是通过对训练数据进行各种变换(如旋转、翻转、裁剪等)&am…...
卷积神经网络之AlexNet经典神经网络,实现手写数字0~9识别
深度学习中较为常见的神经网络模型AlexNet,AlexNet 是一个采用 GPU 训练的深层 CNN,本质是种 LeNet 变体。由特征提取层的5个卷积层两个下采样层和分类器中的三个全连接层构成。 先看原理: AlexNet网络特点 采用 ReLU 激活函数,…...
建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11
这次我们继续解读代码,我们主要来看下面两个部分; 至于人脸识别成功的要点我们在最后总结~ 具体代码学习: #定义人脸名称 def name():#预学习照片存放位置path M:/python/workspace/PythonProject/face/imagePaths[os.path.join(path,f) f…...
全球化趋势下中资企业出海投资及合规运营实战分享
企业全球化布局需构建“战略-架构-合规-运营”四位一体体系,通过灵活的投资架构、精准的税务规划、本土化运营和ESG融合,实现风险可控的海外扩张。核心策略包括: 供应链多节点布局(至少3个国家备份产能);融…...
2025-2-19 leetcode刷题情况(二叉树)
一、226.翻转二叉树 1.题目描述 给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点 2.代码 3.思路 递归遍历(DFS)交换每个节点的左 / 右子节点,即可生成二叉树的镜像。 递归解析: 终止条件&a…...
Linux常见命令
文件和目录操作命令 cd:用于切换目录。例如,cd /home/user 可进入 /home/user 目录;cd.. 可返回上一级目录。ls:用于列出目录内容。ls 直接列出当前目录下的文件和文件夹;ls -l 以详细列表形式显示;ls -a 显…...
C++ 一篇读懂“值传递”和“地址传递”
让我们通过一个简单的、形象的比喻来帮助你理解“值传递”和“地址传递”是如何影响实参的。 1. 值传递 想象你有一个 **信封**(代表变量),里面放着一张纸条(代表数据)。你决定把这个信封寄给一个朋友,让他…...
我用AI做数据分析之数据清洗
我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样? 这里描述自己在使用AI进行数据分析(数据清洗)过程中的几个小故事: 1. 变量名的翻译 有一个项目是某医生自己收集的数据,变量名使用的是中文,分…...
韩国哈希散列算法DHA-256
韩国哈希散列算法DHA-256 DHA-256是在2005年11月由NIST举行的Hash研讨会(Cryptographic Hash Workshop)上提出的。DHA-256压缩函数将长度为512比特的分组,压缩成长度为256比特的串,总共迭代64步,扩展的消息字在步函数中使用了两次。 DHA-25…...
【愚公系列】《Python网络爬虫从入门到精通》022-Splash的爬虫应用
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
Golang深度学习
前言 在2009年,Google公司发布了一种新的编程语言,名为Go(或称为Golang),旨在提高编程效率、简化并发编程,并提供强大的标准库支持。Go语言的设计者们希望通过Go语言能够解决软件开发中的一些长期存在的问…...
React(8)
封装评论列表的Item组件 实现父传子以及子组件调用父组件方法 import { useEffect, useState } from "react"; import "./index.css"; import _ from "lodash"; import classNames from "classnames"; import axios from "axio…...
自制AirTag,支持安卓/鸿蒙/PC/Home Assistant,无需拥有iPhone
苹果的AirTag很贵,虽然某强北有平价代替品,但是仍需要苹果设备才能绑定,才能查看位置。不支持安卓/鸿蒙/PC,也不支持集成到Home Assistant中。 AirTag 的原理 每个AirTag都会发送一个蓝牙信号,其可以被临近的苹果设备…...
docker修改镜像默认存储路径(基于页面迁移)
文章目录 1、停止服务2、拷贝镜像3、docker界面设置路径4、重新启动服务5、重启电脑 1、停止服务 桌面底部右键打开任务管理器 停止docker服务 2、拷贝镜像 从原目录拷贝到新的目录下,新的目录自己定,如果没有权限,需要先对原文件添加权限…...
10. 软件设计架构-经典架构问题
文章目录 前言一、高并发场景下的系统崩溃1. 问题描述2. 解决方案:3. 案例分析:电商秒杀系统 二、单体架构到微服务的拆分陷阱1. 问题描述2. 解决方案:3. 案例分析:在线教育平台拆分 三、分布式系统中的数据一致性难题1. 问题描述…...
Qt学习(五)自定义对话框,多窗口开发---添加设计师类, MDI多窗口开发
一 对话框 实现功能:打开文件,选择目录,保存文件,选择颜色,选择字体,输入信息, 消息提示框 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE na…...
【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》
“谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!” 本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法…...
深入浅出CSS复合选择器:掌控元素关系与层级选择
目录 前言 一、子代选择器(Descendant Selector) 1. 什么是子代选择器? 2. 基本语法 3. 示例 4. 注意事项 二、直接子元素选择器(Child Selector) 1. 什么是直接子元素选择器? 2. 基本语法 3. 示例…...
LLM 推理中推理-时间计算技巧
25年2月来自香港科技大学广州分校的论文“Bag of Tricks for Inference-time Computation of LLM Reasoning”。 随着大语言模型 (LLM) 的进步,解决复杂的推理任务越来越受到关注。推理-时间计算方法(例如 Best-of-N、波束搜索等)特别有价值…...
【模板】图论 最短路 (Floyd+SPFA+Dijkstra)
FloydSPFADijkstra 温故而知新,这三种算法都是求最短路问题常用的算法(特别是Dijkstra) 1.Floyd (多源最短路) 基于动态规划思想,时间复杂度为 O ( N 3 ) O(N^3) O(N3) 较高。 注意点: 初始化距离为INF…...
vite-vue-ts使用arco-design-vue定制主题的后动态变更主题思路
定制主题的后动态变更主题思路 安装依赖与主题定制动态变更主题过程尝试修改主题色(结果失败)尝试修改主题色(结果成功,但是hover的主题色没有变,未覆盖10个梯度的色值)根据主题色实现10个梯度颜色实现10个…...
递归爬取网页测试
我们正在做基于大模型的数据分析平台。 当前需要测试ezdata的递归爬取功能,爬取到第几层 测试网址 https://blog.csdn.net/m0_68177611/article/details/144936089...
【论文学习】RVS-FDSC:一种基于四方向条带卷积的视网膜血管分割方法以增强特征提取
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言论文论文内容RSC模块MSPF2 模块RPDA模块 实验效果 总结互动致谢参考往期回顾 前言…...
交友项目-交友软件简介
一、 项目背景 在线社交是互联网时代的产物,已成为互联网用户的基础需求之一。移动互联网自2003年起快速发展,促使在线社交逐渐从PC端转移至移动端。移动社交最初以熟人社交为主,以维系熟人关系、共享资源信息的形式存在。随着人们交友需求的…...
新手向:SpringBoot后端查询到数据,前端404?(附联调时各传参方式注解总结-带你一文搞定联调参数)
前言: 在 Spring Boot 项目开发中,后端小伙伴可能经常遇到这样诡异的场景: 后台日志显示查询到了数据,但前端却一脸懵逼地告诉你 404 Not Found?接口明明写好了,Postman 直接访问却提示找不到?…...
Elasticsearch7.6.2 安装过程
一. 安装JDK1.8 (1)创建安装目录 mkdir /usr/local/java/ (2)解压至安装目录 tar -zxvf jdk-8u251-linux-x64.tar.gz -C /usr/local/java/ (3)设置环境变量 vim /etc/profile 在末尾添加 export JA…...
汇能感知的光谱相机/模块产品有哪些?
CM020A 分辨率:1600H1200V 光谱范围:350~950nm 光谱分辨率:1nm 接口:USB2.0 帧率:16001200 (6帧) 输出格式:Raw 8bit FOV:D73.5H58.8V44.1 相机尺寸:505055mm VM02S10 分辨率…...
【机器学习】K折交叉验证(K-Fold Cross-Validation)
文章目录 K折交叉验证步骤详解一. 核心目标二. 具体步骤与操作三. 关键变体与场景适配3.1 分层K折交叉验证3.2 时间序列K折交叉验证3.3 留一法(LOO)3.4 重复K折交叉验证 四. 实践注意事项五. Python代码示例六. 总结 K折交叉验证步骤详解 一. 核心目标 …...
【核心算法篇十九】《 DeepSeek因果推断:双重差分模型如何破解政策评估的「时空难题」》
一、当AB实验不可行时,我们该相信什么?(因果推断困局解析) 假设某城市推出「夜间地铁免费」政策,市长想知道这个政策是否真的提升了夜间经济。这时候你会发现: 1️⃣ 无法克隆城市:不能同时存在一个「实施政策」和「不实施政策」的平行宇宙 2️⃣ 数据混杂严重:疫情反…...
使用vue3框架vue-next-admin导出列表数据
在 Vue3 中实现 Excel 导出功能可以通过以下步骤完成,这里使用 xlsx 库来实现前端 Excel 导出: 1. 安装依赖 npm install xlsx file-saver # 或 yarn add xlsx file-saver2. 实现代码示例 需要在当前页引入 import * as XLSX from "xlsx";注…...
机器学习(1)安装Pytorch
1.安装命令 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 2.安装过程Log: Looking in indexes: https://download.pytorch.org/whl/cu118 Co…...
讯方·智汇云校华为官方授权培训机构
1.官方授权 讯方智汇云校是华为领先级授权培训机构(华为授权培训合作伙伴(HALP)体系,分为认证、优选、领先三个等级,领先级是HALP最高级),代表着华为对培训合作伙伴在专业能力、师资队伍、合作…...
彻底理解零拷贝技术,zero-copy
计算机处理的任务大体可以分为两类:CPU密集型与IO密集型。当前流行的互联网应用更多的属于IO密集型,传统的IO标准接口都是基于数据拷贝的,这篇文章我们主要关注该怎样从数据拷贝的角度来优化IO性能,让你的程序在IO性能方面赶超P8。…...
使用 MySQL 从 JSON 字符串提取数据
使用 MySQL 从 JSON 字符串提取数据 在现代数据库管理中,JSON 格式因其灵活性而广泛使用。然而,当数据存储在 JSON 中时,我们经常需要将其转换为更易于处理的格式。本篇文章将通过一个具体的 SQL 查询示例,展示如何从存储在 MySQ…...
矛盾(WEB)
##解题思路 打开靶场就是一段自相矛盾的代码,既要num是数字类型,又要判断为1 这种情况我们会想到弱类型的编程语言,插件查看过后,php就是弱类型的语言,此处并非是严格相等,只是 因此可以根据弱类型编程语言…...
优先队列(典型算法思想)—— OJ例题算法解析思路
目录 一、1046. 最后一块石头的重量 - 力扣(LeetCode) 算法代码: 代码思路 使用优先队列(大根堆) 将所有石头放入堆中 模拟碰撞过程 返回最后的重量 代码解析 时间复杂度 示例 输入 输出 二、703. 数据流…...
IGBT的损耗性分析
铝合金外壳设计器地址:嘉立创铝合金外壳/壳体/盒型-让您的产品更出彩 IGBT和MOS的损耗谁大: 电子元器件常见失效模式: 电子元器件的失效模式多种多样,以下是一些常见的失效模式及其原因: 开路: 原因:内部连接断开、焊点断裂、导线断裂等。 影响:电流无法通过,电路中断。…...
TypeScript跟js,es6这些的区别
TypeScript 一、TypeScript 是什么 想象 JavaScript 是一个自由奔放的艺术家,它在创作(编写代码)时不受太多约束,非常灵活,但有时也容易犯错且难以调试。而 TypeScript 就像是给这位艺术家配备了一套精确的工具和规范…...
单例模式代码示例
饿汉式:在类加载时就创建单例实例,线程安全。代码如下: public class Singleton {// 私有静态实例private static final Singleton instance new Singleton();// 私有构造函数private Singleton() {}// 公共访问方法public static Singleto…...
掌握 ElasticSearch的 _source 过滤
掌握 ElasticSearch的 _source 过滤 1. 引言2. _source 元数据基础2.1 什么是 _source 字段?2.2 _source 的基本用法 3. 禁用 _source3.1 如何禁用 _source 字段3.2 禁用 _source 的利弊3.3 最佳实践建议 4. _source 数据源过滤4.1 为什么需要数据源过滤?…...
车载音频配置(二)
目录 OEM 自定义的车载音频上下文 动态音频区配置 向前兼容性 Android 14 车载音频配置 在 Android 14 中,AAOS 引入了 OEM 插件服务,使你可以更主动地管理由车载音频服务监督的音频行为。 随着新的插件服务的引入,车载音频配置文件中添加了以下更改: • OEM 自定义的车…...
开目3DCAPP系列:三维制造成本分析与估算软件3DDFC
开目3DDFC 是一款基于 MBD 模型和工艺知识库的专业三维制造成本分析与估算软件,在不依赖详细工艺路线的情况下,根据零件几何信息和精度信息一键式完成零件成本的分析与估算,为面向成本的设计优化提供参考指引,也为企业对外产品报价…...