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

Linux笔记---线程控制

1. 线程创建:pthread_create()

pthread_create() 是 POSIX 线程库(pthread)中用于创建新线程的函数。调用该函数后系统就会启动一个与主线程并发的线程,并使其跳转到入口函数处执行。

#include <pthread.h>int pthread_create(pthread_t *thread,          // 指向线程标识符的指针const pthread_attr_t *attr, // 线程属性(通常设为 NULL 使用默认值)void *(*start_routine)(void*), // 线程执行的函数void *arg                   // 传递给线程函数的参数
);

参数说明: 

  1. pthread_t* thread:输出型参数,存储新创建线程的标识符(线程 ID)。
  2. const pthread_attr_t* attr:设置线程的属性(如栈大小、调度策略等)。 常用值:NULL(使用默认属性)。 
  3. void* (*)(void*) start_routine:新线程启动后执行的函数(线程入口点)。 要求:必须返回 void*,且接受一个 void* 参数。
  4. void* arg:传递给 start_routine 的参数。 注意:若无需参数,可传 NULL;若需传递多个参数,可封装为结构体。

返回值: 

  • 成功:返回 0。
  • 失败:返回错误码(如 EAGAIN、EINVAL 等),但不设置 errno。

示例代码: 

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <pthread.h>
using namespace std;void* start_routine(void* arg)
{cout << "start_routine: 线程创建成功" << endl;return nullptr;
}int main()
{pthread_t tid;int n = pthread_create(&tid, nullptr, start_routine, nullptr);if(n != 0){cout << "线程创建失败: " << strerror(n) << endl;}while(true);return 0;
}


2. 线程等待:pthread_join()

pthread_join() 是 POSIX 线程库中用于等待线程结束并回收其资源的函数。

主线程如何取得线程运行结束的返回值呢?我们可以使用pthread_join()函数来对指定线程进行等待,并获取其返回值。和waitpid()函数一样,调用这个函数会使主线程阻塞在调用处直到被等待的指定线程运行结束

和多进程编程一样,线程如果不进行等待回收,那么其就会一直保留其运行结果等信息,造成内存泄漏。除此之外,与多进程编程不一样的是,一个进程的多个线程共享主线程的地址空间,一旦主线程退出,其创建的所有线程都会被强制终止,无论其是否执行完

所以在上面的例子当中,线程启动之后我们让主线程陷入了死循环当中,避免其提前退出。

#include <pthread.h>int pthread_join(pthread_t thread,     // 要等待的线程 IDvoid **retval         // 指向线程返回值的指针(可选)
);

核心功能:

  • 阻塞等待:调用 pthread_join() 的线程会暂停执行,直到目标线程终止。
  • 资源回收:线程终止后,其占用的系统资源(如线程描述符、栈空间)会被释放。 若不调用 pthread_join(),终止的线程会成为 “僵尸线程”,造成资源泄漏。
  • 获取返回值:通过 retval 参数获取目标线程的返回值(start_routine 的返回值或 pthread_exit() 的参数)。 

参数说明:

  1. pthread_t thread:指定要等待的线程 ID(由 pthread_create() 返回)。
  2. void** retval:输出型参数,存储线程的返回值(即线程函数 start_routine 的返回值)。 若无需获取返回值,可传 NULL。

 返回值:

  • 成功:返回 0。
  • 失败:返回错误码(如 EDEADLK、ESRCH 等)。

示例代码:

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <pthread.h>
using namespace std;void* start_routine(void* arg)
{cout << "start_routine: 线程创建成功" << endl;for(int i = 0; i < 5; i++){cout << "计数----->" << i << endl;sleep(1);}return (void*)10;
}int main()
{pthread_t tid;int n = pthread_create(&tid, nullptr, start_routine, nullptr);if(n != 0){cout << "线程创建失败: " << strerror(n) << endl;}int result;int m = pthread_join(tid, (void**)&result);if(m != 0){cout << "线程等待失败: " << strerror(m) << endl; }cout << "线程的返回值为: " << result << endl;return 0;
}


3. 线程终止

除主线程以外,线程的正常终止有三种情况:

  1. 从入口函数的return处返回
  2. 调用pthread_exit()函数退出(调用exit()函数会导致整个进程退出)
  3. 某个线程调用pthread_cancel()来终止指定线程

 3.1 pthread_exit()

#include <pthread.h>void pthread_exit(void *retval);  // 无返回值,终止当前线程

核心功能:

  • 终止线程执行:调用 pthread_exit() 的线程会立即停止执行,并释放其占用的资源(如栈空间),但不会释放整个进程的资源。
  • 传递返回值:retval 作为返回值被传递给等待该线程的其他线程。
  • 不影响其他线程:仅终止当前线程,不会影响进程中的其他线程或主线程。

参数说明:

  • void* retval:线程的返回值,可通过 pthread_join() 的 retval 参数获取。 若无需返回值,可传 NULL。

3.2 pthread_self()

pthread_self()函数用于线程获取自身的线程ID。

#include <pthread.h>pthread_t pthread_self(void);  // 返回当前线程的 ID

返回调用该函数的线程的唯一标识符。

3.3 pthread_cancel()

pthread_cancel() 是 POSIX 线程库中用于请求终止某一个线程的函数。

#include <pthread.h>int pthread_cancel(pthread_t thread);  // 请求取消指定线程

 核心功能:

  • 发送取消请求:pthread_cancel() 向目标线程发送一个 “取消请求”,而非强制终止。线程是否响应以及如何响应取决于其取消状态和取消类型。
  • 取消点:预定义的系统调用(如 sleep()、read()、write()、pthread_join() 等),线程在执行这些函数时会检查并处理取消请求。

参数说明:

  • pthread_t thread:要取消的线程 ID(由 pthread_create() 返回)。 

返回值:

  • 成功:返回 0。
  • 失败:返回错误码(如 ESRCH,表示线程 ID 不存在)。 

 示例代码:

// 终止自己==pthread_exit()
pthread_cancel(pthread_self());

4. 线程分离:pthread_detach()

pthread_detach() 是 POSIX 线程库中用于将线程设置为分离状态的函数。

分离状态的线程在终止后,会自动释放其占用的系统资源(如线程描述符、栈空间),无需其他线程调用 pthread_join() 回收。

并且其他线程调用pthread_join()对分离状态的线程进行回收是非法的,会导致未定义错误。

#include <pthread.h> int pthread_detach(pthread_t thread); // 设置线程为分离状态

参数说明:

  • pthread_t thread:要设置为分离状态的线程 ID(由 pthread_create() 返回)。

返回值:

  • 成功:返回 0。
  • 失败:返回错误码(如 ESRCH、EINVAL 等)。 

注意事项:

  • 分离状态不可逆转:一旦线程被设置为分离状态,无法再变回 joinable 状态。
  • 返回值无法获取:分离线程的返回值会被自动丢弃,不能通过 pthread_join() 获取。
  • 资源释放的确定性:分离线程终止后,系统会立即回收其资源,无需等待其他线程操作。
  • 错误处理:若对已终止的线程调用 pthread_detach(),可能返回 ESRCH。 若对已分离的线程重复调用 pthread_detach(),可能返回 EINVAL。 

示例代码:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>void* detached_thread(void* arg) {printf("分离线程开始运行...\n");sleep(2);  // 模拟耗时操作printf("分离线程结束\n");return NULL;
}int main() {pthread_t thread_id;// 创建新线程if (pthread_create(&thread_id, NULL, detached_thread, NULL) != 0) {perror("线程创建失败");return 1;}// 将线程设置为分离状态if (pthread_detach(thread_id) != 0) {perror("设置分离状态失败");return 1;}printf("主线程继续执行,不等待分离线程\n");// 主线程可以提前退出,分离线程仍会继续执行sleep(1);printf("主线程退出\n");return 0;
}
// 分离自己
pthread_detach(pthread_self());

5. 线程标识符

在 Linux 系统中,pthread_t 类型的线程标识符(tid)本质上是一个轻量级进程(LWP)ID或指向线程控制块的指针。

5.1 线程控制块(TCB)

每个线程在内核中对应一个 task_struct 结构(与进程相同),但共享父进程的资源。

而在用户空间中,经过pthread库的包装之后另外设置了一种数据结构来维护额外的线程数据,即TCB,包括如下控制信息:

  • 线程状态(运行、阻塞等)
  • 线程栈地址和大小
  • 信号掩码
  • 内核 LWP ID

 5.2 pthread_t类型的本质

在 Linux 中,pthread_t 的具体类型定义取决于实现:

  • glibc/NPTL:pthread_t 通常是一个 struct pthread*,即指向线程控制块的指针
  • 用户可见性:pthread_t 对用户是不透明的,只能通过 POSIX 线程 API 操作。

相关文章:

Linux笔记---线程控制

1. 线程创建&#xff1a;pthread_create() pthread_create() 是 POSIX 线程库&#xff08;pthread&#xff09;中用于创建新线程的函数。调用该函数后系统就会启动一个与主线程并发的线程&#xff0c;并使其跳转到入口函数处执行。 #include <pthread.h>int pthread_cr…...

【AI论文】扩展大型语言模型(LLM)智能体在测试时的计算量

摘要&#xff1a;扩展测试时的计算量在提升大型语言模型&#xff08;LLMs&#xff09;的推理能力方面已展现出显著成效。在本研究中&#xff0c;我们首次系统地探索了将测试时扩展方法应用于语言智能体&#xff0c;并研究了该方法在多大程度上能提高其有效性。具体而言&#xf…...

Spring--IOC容器的一些扩展属性

一、BeanFactoryPostProcessor和BeanPostProcessor BeanFactoryPostProcessor的作用是在实例化前修改BeanDefinition的属性 BeanPostProcessor的作用是在bean完成创建实例、填充属性之后&#xff0c;初始化阶段的前后都会对bean进行操作&#xff0c;使用postProcessBeforeIni…...

WebClient 功能介绍,使用场景,完整使用示例演示

WebClient 功能介绍 WebClient 是 Spring 5 中引入的响应式 HTTP 客户端&#xff0c;用于替代已弃用的 RestTemplate&#xff0c;专为异步非阻塞编程设计&#xff0c;基于 Reactor 框架实现。其核心功能包括&#xff1a; 异步与非阻塞 通过 Mono 和 Flux 处理请求与响应&#…...

[Java 基础]ArrayList

ArrayList 类是一个可以动态修改的数组&#xff0c;与普通数组的区别就是它是没有固定大小的限制。 ArrayList 的示意可以看 VCR&#xff1a;https://visualgo.net/en/array 创建 ArrayList 对象 final ArrayList<String> strings new ArrayList<>();这里创建 …...

用无人机和AI守护高原净土:高海拔自然保护区的垃圾检测新方法

这篇题为《Automatic Detection of Scattered Garbage Regions Using Small Unmanned Aerial Vehicle Low-Altitude Remote Sensing Images for High-Altitude Natural Reserve Environmental Protection》的论文&#xff0c;发表于 Environmental Science & Technology&am…...

《Redis高并发优化策略与规范清单:从开发到运维的全流程指南》

Redis高并发优化策略与规范清单&#xff1a;从开发到运维的全流程指南 在互联网应用的后端架构中&#xff0c;Redis凭借其高性能、高并发的特性&#xff0c;成为缓存和数据存储的首选方案。无论是电商抢购、社交平台的点赞计数&#xff0c;还是在线旅游平台的实时数据查询&…...

Linux基本指令篇 —— man指令

man命令是Linux系统中最重要的命令之一&#xff0c;它是"manual"&#xff08;手册&#xff09;的缩写&#xff0c;用于查看Linux系统中命令、函数、配置文件等的详细说明文档。man命令是Linux系统管理员和开发者的必备工具&#xff0c;熟练掌握man命令可以大大提高工…...

Spring Boot使用MCP服务器

1、JDK版本17 2、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apac…...

学习Linux进程冻结技术

原文&#xff1a;蜗窝科技Linux进程冻结技术 功耗中经常需要用到&#xff0c;但是linux这块了解甚少&#xff0c;看到这个文章还蛮适合我阅读的 1 什么是进程冻结 进程冻结技术&#xff08;freezing of tasks&#xff09;是指在系统hibernate或者suspend的时候&#xff0c;将…...

Docker基本概念——AI教你学Docker

1.1 Docker 概念详解 1. Docker 是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;它让开发者可以将应用及其依赖打包到一个可移植的容器&#xff08;Container&#xff09;中&#xff0c;并在任何支持 Docker 的 Linux、Windows 或 macOS 系统上运行。这样做…...

第十六届蓝桥杯C/C++程序设计研究生组国赛 国二

应该是最后一次参加蓝桥杯比赛了&#xff0c;很遗憾&#xff0c;还是没有拿到国一。 大二第一次参加蓝桥杯&#xff0c;印象最深刻的是居然不知道1s是1000ms&#xff0c;花了很多时间在这题&#xff0c;后面节奏都乱了&#xff0c;抗压能力也不行&#xff0c;身体也不适。最后…...

Python 数据分析与可视化 Day 5 - 数据可视化入门(Matplotlib Seaborn)

&#x1f3af; 今日目标 掌握 Matplotlib 的基本绘图方法&#xff08;折线图、柱状图、饼图&#xff09;掌握 Seaborn 的高级绘图方法&#xff08;分类图、分布图、箱线图&#xff09;熟悉图像美化&#xff08;标题、标签、颜色、风格&#xff09;完成一组学生成绩数据的可视化…...

WebRTC(八):SDP

SDP 概念 SDP 是一种描述多媒体通信会话的文本格式&#xff08;基于 MIME&#xff0c;RFC 4566&#xff09;。本身 不传输数据&#xff0c;仅用于在会话建立阶段传递信息。常与 SIP&#xff08;VoIP&#xff09;、RTSP、WebRTC 等协议配合使用。 用途 描述媒体类型&#xf…...

《哈希表》K倍区间(解题报告)

文章目录 零、题目描述一、算法概述二、算法思路三、代码实现四、算法解释五、复杂度分析 零、题目描述 题目链接&#xff1a;K倍区间 一、算法概述 计算子数组和能被k整除的子数组数量的算法。通过前缀和与哈希表的结合&#xff0c;高效地统计满足条件的子数组。  需要注…...

牛津大学开源视频中的开放世界目标计数!

视频中的开放世界目标计数 GitHub PaPer Niki Amini-Naieni nikianrobots.ox.ac.uk Andrew Zisserman azrobots.ox.ac.uk 视觉几何组&#xff08;VGG&#xff09;&#xff0c;牛津大学&#xff0c;英国 ​ 图 1&#xff1a;视频中的目标计数&#xff1a;给定顶行的视频&#…...

1.2、CAN总线帧格式

1、帧类型 2、帧类型介绍 &#xff08;1&#xff09;数据帧 扩展格式是为了扩展ID&#xff0c;ID号每4位一个字节&#xff08;11位最大ID号为0x7FF&#xff09; &#xff08;2&#xff09;遥控帧 遥控帧由于没有Data&#xff0c;所以DLC可能没有意义&#xff0c;可给任意值&am…...

DeepSeek今天喝什么随机奶茶推荐器

用DeepSeek生成了一个随机奶茶推荐器-今天喝什么&#xff0c;效果非常棒&#xff01;UI界面美观。 提示词prompt如下 用html5帮我生成一个今天喝什么的网页 点击按钮随机生成奶茶品牌等&#xff0c;要包括中国常见的知名的奶茶品牌 如果不满意还可以随机再次生成 ui界面要好看 …...

词编码模型怎么进行训练的,输出输入是什么,标签是什么

词编码模型怎么进行训练的,输出输入是什么,标签是什么 词编码模型的训练本质是通过数据驱动的方式,将离散的文本符号映射为连续的语义向量。 一、训练机制:从符号到向量的映射逻辑 1. 核心目标 将单词/子词(Token)映射为低维向量,使语义相关的词在向量空间中距离更近…...

LSTM、GRU 与 Transformer网络模型参数计算

参数计算公式对比 模型类型参数计算公式关键组成部分LSTM4 (embed_dim hidden_size hidden_size hidden_size)4个门控结构GRU3 (embed_dim hidden_size hidden_size hidden_size)3个门控结构Transformer (Encoder)12 embed_dim 9 embed_dim ff_dim 14 embed_dim…...

nnv开源神经网络验证软件工具

一、软件介绍 文末提供程序和源码下载 用于神经网络验证的 Matlab 工具箱&#xff0c;该工具箱实现了可访问性方法&#xff0c;用于分析自主信息物理系统 &#xff08;CPS&#xff09; 领域中带有神经网络控制器的神经网络和控制系统。 二、相关工具和软件 该工具箱利用神经…...

SQLite3 在嵌入式系统中的应用指南

SQLite3 在嵌入式系统中的应用指南 一、嵌入式系统中 SQLite3 的优势 SQLite3 是嵌入式系统的理想数据库解决方案&#xff0c;具有以下核心优势&#xff1a; 特性嵌入式系统价值典型指标轻量级适合资源受限环境库大小&#xff1a;500-700KB零配置无需数据库管理员开箱即用无…...

原生微信小程序网络请求与上传接口封装实战指南

本文基于微信小程序原生 API&#xff0c;封装 request 和 uploadFile 接口&#xff0c;最终实现统一请求管理、请求拦截、错误处理等能力。 &#x1f4e6; 一、为什么要封装网络请求&#xff1f; 微信小程序提供了 wx.request 和 wx.uploadFile 原生 API&#xff0c;但直接使用…...

电路图识图基础知识-塔式起重机控制电路识图与操作要点(三十五)

引言&#xff1a; 塔式起重机作为建筑施工中不可或缺的大型起重运输机械设备&#xff0c;其控制电路的识图与操作对于确保施工安全和效率至关重要。本文将详细介绍塔式起重机的控制电路识图&#xff0c;帮助操作人员更好地理解和掌握其工作原理。 一、塔式起重机概述 塔式起重…...

基于SpringBoot + Vue 的网上拍卖系统

基于springbootvue的在线拍卖系统| Java | vue | 配万字文档 | springboot001 〔运行环境〕 Java版本&#xff1a;jdk1.8 node版本&#xff1a;13.x python版本&#xff1a;2.7 IDE类型&#xff1a;idea或exlipse 数据库&#xff1a;MySQL&#xff08;5.x或8.x版本都…...

用 EXCEL/WPS 实现聚类分析:赋能智能客服场景的最佳实践

聚类分析作为无监督学习的核心技术&#xff0c;能在客服数据中发现隐藏的用户群体或问题模式。尽管 Excel/WPS 并非专业统计软件&#xff0c;但巧妙利用其内置功能&#xff0c;也能实现基础的聚类分析&#xff0c;为中小型客服团队提供快速洞察。以下介绍具体方法及智能客服场景…...

利用mold加快rust程序构建

我用rust的cargo build命令编译polars-cli时&#xff0c;用时达到14分钟&#xff0c;如下所示。 Finished dev profile [unoptimized debuginfo] target(s) in 14m 19s&#xff0c;通过核对时间戳&#xff0c;发觉其中最后一步生成可执行文件花了6分钟。 于是向DeepSeek请教&a…...

leetcode543-二叉树的直径

leetcode 543 思路 路径长度计算&#xff1a;任意两个节点之间的路径长度&#xff0c;等于它们的最低公共祖先到它们各自的深度之和递归遍历&#xff1a;通过后序遍历&#xff08;左右根&#xff09;计算每个节点的左右子树深度&#xff0c;并更新全局最大直径深度与直径的关…...

(三)yolov5——模型训练

一、准备数据 先准备一个MP4的视频 1.测试一帧 使用opencv来提取每一个视频的帧 先使用以下代码查看一帧的内容&#xff0c;是否符合预期 import cv2 import matplotlib.pyplot as plt# 打开视频文件 video cv2.VideoCapture("111.mp4") # 读取一帧 ret, frame…...

STM32对接霍尔传感器

STM32对接霍尔传感器的技术解析与应用实现,结合测速原理、硬件设计、代码实现及进阶应用,涵盖从基础到实战的全流程指南,可以应用到金属检测等功能。 ⚙️ 一、霍尔传感器基础 工作原理 霍尔传感器基于霍尔效应,当磁铁靠近时输出电平变化(常开型无磁铁时输出高电平,靠近时…...

SpringCloud系列(32)--使用Hystrix进行全局服务降级

前言&#xff1a;在上一节中我们使用Hystrix进行了服务降级&#xff0c;但是要在每个方法上面配置HystrixCommand才能实现服务降级&#xff0c;如果需要进行服务降级的方法多了&#xff0c;HystrixCommand也就得配置很多遍&#xff0c;所以本节内容则是使用Hystrix进行了全局服…...

Origin绘制三Y轴柱状图、点线图、柱状点线图

三Y轴柱状图是一种高级数据可视化形式&#xff0c;它通过三个独立的纵轴在同一个图表中展示不同量纲或量级的数据系列。其主要用于揭示不同量级指标间的关联性&#xff08;例如高销售额是否伴随高利润率&#xff09;。 当数据满足以下条件时&#xff0c;即可绘制三Y轴图&#x…...

通信网络编程3.0——JAVA

主要添加了私聊功能 1服务器类定义与成员变量 public class ChatServer {int port 6666;// 定义服务器端口号为 6666ServerSocket ss;// 定义一个 ServerSocket 对象用于监听客户端连接//List<Socket> clientSockets new ArrayList<>();// 定义一个列表用于存储…...

4-深度学习网络层

深度学习模型 Embedding层 Embedding矩阵是可训练的参数&#xff0c;一般会在模型构建时随机初始化 也可以使用预训练的词向量来做初始化&#xff0c;此时也可以选择不训练Embedding层中的参数 输入的整数序列可以有重复&#xff0c;但取值不能超过Embedding矩阵的列数 核心…...

【LeetCode】用双指针解决移除元素问题、合并两个有序数组求解

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;…...

车载诊断架构协议篇 --- OBDonUDS和ZEVonUDS

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 做到欲望极简&#xff0c;了解自己的真实欲望&#xff0c;不受外在潮流的影响&#xff0c;不盲从&#x…...

医学 Agent:自带医学深度调研 deep research,优化治疗策略+药物参考

医学 Agent&#xff1a;自带医学深度调研deep research&#xff0c;优化治疗策略药物参考 第一版代码输出结果&#xff0c;居然连不上网运行结果梳理 第二版结果测试 第一版代码 医疗顾问AI系统 - 基于Qwen API 的智能医疗助手 最终目标&#xff1a;构建一个能够查询疾病治疗方…...

硬件工程师笔试面试高频考点汇总——(2025版)

目录 1 电子器件部分 1.1 电阻 1.1.1 电阻选型时一般从哪几个方面进行考虑? 1.1.2 上拉下拉电阻的作用 1.1.3 PTC热敏电阻作为电源电路保险丝的工作原理 1.1.4 如果阻抗不匹配&#xff0c;有哪些后果 1.1.5 电阻、电容和电感0402、0603和0805封装的含义 1.1.6 电阻、电…...

春秋云镜【CVE-2017-18349】fastjson wp

知识点 fastjson反序列化 将json转为java对象的过程 漏洞存在版本 Fastjson<1.2.24 漏洞原理 fastjson引入的autotype功能&#xff0c;本来是为了区分同名同元素但是不同类型的对象序列化后内容一致无法还原的问题&#xff0c;但是这一操作允许了json数据中通过type来指定对…...

网络编程:八股文

一.Reactor网络模型 ------------------- | 应用主线程 | -------------------|v ------------------- | Reactor | | (事件分发器) | -------------------|v ------------------- | 事件多路分发器 | <--- epoll/poll/select -----------------…...

设计模式精讲 Day 11:享元模式(Flyweight Pattern)

【设计模式精讲 Day 11】享元模式&#xff08;Flyweight Pattern&#xff09; 文章内容 在软件开发过程中&#xff0c;我们常常需要处理大量相似对象的创建和管理问题。如果这些对象之间存在大量的重复信息&#xff0c;直接创建每一个对象会导致内存占用过高、系统性能下降。享…...

常用终端命令(Linux/macOS/bash 通用)分类速查表

文件与目录操作 命令作用说明pwd显示当前路径ls列出当前目录内容ls -l以列表形式显示文件详细信息ls -a显示所有文件&#xff08;包括隐藏文件&#xff09;cd <目录名>进入指定目录cd ..返回上一级目录cd ~回到用户主目录mkdir <目录名>创建目录mkdir -p a/b/c创建…...

Robyn高性能Web框架系列04:事件、中间件与错误处理

请求-响应过程 应用启动、关闭事件1、启动事件&#xff08;Startup Events&#xff09;2、关闭事件&#xff08;Shutdown Events&#xff09; 中间件1、前置中间件&#xff08;BeforeRequest&#xff09;2、后置中间件&#xff08;AfterRequest&#xff09;3、示例&#xff1a;…...

深入理解JavaScript设计模式之迭代器模式

文章目录 深入理解JavaScript设计模式之迭代器模式定义官方翻译白话翻译 实现jQuery中的each迭代器实现数组迭代器迭代器实现创建Dom元素 内部迭代器和外部迭代器内部迭代器外部迭代器 迭代类数组对象和字面量对象倒序迭代器中止迭代器迭代器的应用举例音乐播放器案例待输出更新…...

【项目管理】项目管理资料文档模板(ZIP,PPT,WORD)

项目交付文档 01项目详细调研计划编写规范V1.0.doc 03项目详细调研报告编写规范V1.0.doc 07软件需求规格说明书评审规范V1.0.doc 10.软件需求规格说明.doc 产品检查单,xls 工程评审.zip 软件标准过程集.zip 系统测试管理规程.docx 四)项目管理计划.doc 项目管理系统实施项目管理…...

DeepSeek中的提示库及其用法示例

《DEEPSEEK原生应用与智能体开发实践 图书》【摘要 书评 试读】- 京东图书 为了深入探索DeepSeek提示词样例的丰富内涵&#xff0c;充分挖掘其背后潜藏的无限可能&#xff0c;同时致力于为用户打造更为卓越、便捷且高效的使用体验&#xff0c;DeepSeek官网的API文档匠心独运地…...

292. Nim 游戏

292. Nim 游戏 - 力扣&#xff08;LeetCode&#xff09; 想法 枚举问题&#xff1a; n 1 ~ 3 &#xff0c;由于我先手&#xff0c;我可以直接拿走全部的石头&#xff0c;所以我赢n 4&#xff0c;由于我先手&#xff0c;我拿掉 1 - 3 块石头 &#xff0c;剩下的可能就是 1 -…...

STM32 串口通信②:蓝牙模块HC-05控制单片机

一 前言 上一篇我们已经成功实现单片机和电脑的连接&#xff0c;接下来&#xff0c;我们学习一个有趣的板块&#xff0c;HC-05蓝牙模块&#xff0c;这个蓝牙模块&#xff0c;我们就要建立手机和单片机的通讯啦&#xff0c;还是比较有趣的一个过程&#xff0c;大家可以跟着多操作…...

艾立泰数字化重塑汽车零部件包装租赁行业

在汽车零部件包装租赁行业&#xff0c;资产利用率低、流转效率差、运输成本高等痛点长期困扰企业。艾立泰科技通过数字化解决方案&#xff0c;成为该行业降本增效的关键合作伙伴&#xff0c;助力企业实现从传统管理模式向智能化的跃迁。 精准库存管理&#xff1a;告别“盲人摸…...

Windows电脑数据恢复终极指南:从原理到实战

Windows电脑数据恢复终极指南&#xff1a;从原理到实战 数据丢失是每个电脑用户都可能遭遇的噩梦。本文将为您全面解析Windows平台下的数据恢复技术&#xff0c;从基础原理到高级技巧&#xff0c;帮助您在文件误删、格式化、系统崩溃等情况下找回宝贵数据。 一、数据恢复基础…...