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

嵌入式开发面试常见编程题解析:pthread_join 与 pthread_detach 详解

一、引言

在多线程编程中,线程的资源管理至关重要。pthread_join 和 pthread_detach 是用于线程资源管理的两个重要函数。正确使用它们可以确保线程资源的合理回收,避免出现资源泄漏等问题。本文将详细介绍这两个函数的区别、使用方法、常见易错点以及拓展知识,帮助新手全面掌握这两个函数的使用。

二、pthread_join 函数

2.1 函数定义与作用

pthread_join 函数的原型如下:

#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);

  • 参数解释
    • thread:要等待的线程的线程 ID。
    • retval:一个指针,用于存储被等待线程的返回值。如果不需要获取返回值,可以将其设置为 NULL
  • 作用pthread_join 函数是一个阻塞函数,调用它的线程会被阻塞,直到指定的线程(由 thread 参数指定)终止。在被等待的线程终止后,pthread_join 会回收该线程的资源,并可以通过 retval 获取该线程的返回值。

2.2 使用示例

#include <stdio.h>
#include <pthread.h>// 线程函数
void* thread_function(void* arg) {int result = 10;// 返回结果return (void*)&result;
}int main() {pthread_t thread_id;void* retval;// 创建线程if (pthread_create(&thread_id, NULL, thread_function, NULL) != 0) {perror("pthread_create");return 1;}// 等待线程结束if (pthread_join(thread_id, &retval) != 0) {perror("pthread_join");return 1;}// 获取线程返回值int result = *(int*)retval;printf("线程返回值: %d\n", result);return 0;
}

  • 步骤解释
    1. 定义线程函数 thread_function,该函数返回一个整数指针。
    2. 在 main 函数中,使用 pthread_create 创建一个新线程。
    3. 调用 pthread_join 等待新线程结束,并通过 retval 获取线程的返回值。
    4. 将 retval 转换为 int* 类型,并解引用获取返回的整数。
    5. 打印线程的返回值。

2.3 常见易错点

  • 忘记检查返回值pthread_join 函数调用成功时返回 0,失败时返回错误码。如果忘记检查返回值,可能会忽略线程等待过程中出现的错误。
  • 返回值的生命周期问题:在上述示例中,线程函数返回的是局部变量的地址。当线程结束后,局部变量的内存可能已经被释放,导致获取的返回值是无效的。可以使用全局变量或动态分配的内存来避免这个问题。

2.4 拓展知识

  • 多线程同步pthread_join 可以用于实现线程之间的同步。例如,主线程需要等待多个子线程完成任务后再继续执行,可以依次调用 pthread_join 等待每个子线程结束。
  • 错误处理pthread_join 可能会返回不同的错误码,如 EDEADLK(死锁)、ESRCH(线程 ID 无效)等。在实际应用中,需要根据不同的错误码进行相应的处理。

三、pthread_detach 函数

3.1 函数定义与作用

pthread_detach 函数的原型如下:

#include <pthread.h>
int pthread_detach(pthread_t thread);

  • 参数解释
    • thread:要分离的线程的线程 ID。
  • 作用pthread_detach 函数用于将指定的线程设置为分离状态。处于分离状态的线程在终止时,系统会自动回收其占用的资源,无需其他线程调用 pthread_join 来回收。

3.2 使用示例

#include <stdio.h>
#include <pthread.h>// 线程函数
void* thread_function(void* arg) {printf("线程开始执行\n");// 模拟线程执行一段时间for (int i = 0; i < 100000000; i++);printf("线程执行结束\n");return NULL;
}int main() {pthread_t thread_id;// 创建线程if (pthread_create(&thread_id, NULL, thread_function, NULL) != 0) {perror("pthread_create");return 1;}// 将线程设置为分离状态if (pthread_detach(thread_id) != 0) {perror("pthread_detach");return 1;}// 主线程继续执行其他任务printf("主线程继续执行\n");// 主线程休眠一段时间,确保子线程有足够的时间执行sleep(2);return 0;
}

  • 步骤解释
    1. 定义线程函数 thread_function,该函数简单地打印线程开始和结束的信息。
    2. 在 main 函数中,使用 pthread_create 创建一个新线程。
    3. 调用 pthread_detach 将新线程设置为分离状态。
    4. 主线程继续执行其他任务,如打印信息和休眠。

3.3 常见易错点

  • 重复分离或结合:一个线程只能被分离一次,若已经被分离,再次调用 pthread_detach 会失败。同样,若一个线程已经被 pthread_join 结合,再调用 pthread_detach 也会失败。
  • 无法获取线程返回值:由于分离状态的线程在终止时自动释放资源,无法通过 pthread_join 获取其返回值。如果需要获取线程的返回值,应使用 pthread_join

3.4 拓展知识

  • 线程池中的应用:在线程池的实现中,通常会将工作线程设置为分离状态,这样当工作线程完成任务后,系统会自动回收其资源,避免线程池管理的复杂性。
  • 资源管理优化:对于一些长时间运行且不需要返回值的线程,使用 pthread_detach 可以减少资源管理的开销,提高系统的性能。

四、pthread_join 与 pthread_detach 的区别总结
 

对比维度pthread_joinpthread_detach
阻塞性是阻塞函数。调用该函数的线程会被阻塞,直至目标线程终止。在此期间,调用线程无法执行后续代码,必须等待目标线程结束。是非阻塞函数。调用后会立即返回,调用线程能继续执行后续代码,不用等待目标线程结束。
资源回收方式主动回收目标线程资源。当目标线程终止,pthread_join 负责释放目标线程的栈空间、线程描述符等资源。还能通过第二个参数获取目标线程的返回值。让目标线程在终止时自动释放资源。线程被设置为分离状态后,结束时系统自动回收其资源,但无法通过此方式获取线程返回值。
线程状态影响目标线程需处于可结合(joinable)状态,该状态是新创建线程的默认状态。如果线程已被 pthread_detach 设置为分离状态,调用 pthread_join 会失败。将目标线程从可结合状态转变为分离状态。一旦线程变为分离状态,就不能再对其使用 pthread_join 进行结合操作。
返回值处理可以获取目标线程的返回值,通过第二个参数(void **retval)接收。这在需要知晓目标线程执行结果时非常有用。无法获取目标线程的返回值。因为线程分离后,资源自动回收,没有机制来传递返回值。
使用场景- 需要获取线程执行结果时,例如主线程等待子线程完成复杂计算并返回结果。
- 当主线程的后续操作依赖子线程完成时,如子线程初始化某些资源后主线程才能继续执行。
- 不需要线程返回值的情况,像后台日志记录、定时清理等任务。
- 高并发场景,为避免主线程因等待子线程而阻塞,提高系统并发处理能力。
错误处理关注点需关注返回值判断是否调用成功,常见错误如 EDEADLK(死锁)、ESRCH(线程 ID 无效)等。要注意不能对已分离的线程重复调用,也不能对已用 pthread_join 结合的线程调用,否则会调用失败。

4.1 阻塞性

4.1.1 pthread_join 的阻塞特性

pthread_join 是一个阻塞函数。当一个线程调用 pthread_join 时,该线程会被挂起,进入等待状态,直到目标线程终止。这意味着在目标线程结束之前,调用 pthread_join 的线程无法继续执行后续的代码。

示例代码

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>void* thread_func(void* arg) {sleep(3); // 模拟线程执行 3 秒printf("子线程执行完毕\n");return NULL;
}int main() {pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);printf("主线程调用 pthread_join 开始等待子线程\n");pthread_join(tid, NULL);printf("主线程继续执行\n");return 0;
}

解释

  • 在 main 函数中,主线程创建了一个子线程后,调用 pthread_join 等待子线程结束。
  • 子线程会休眠 3 秒,在这 3 秒内,主线程会被阻塞在 pthread_join 处,无法执行 printf("主线程继续执行\n"); 语句。
  • 当子线程执行完毕后,主线程才会从 pthread_join 处返回,继续执行后续代码。
4.1.2 pthread_detach 的非阻塞特性

pthread_detach 是一个非阻塞函数。当调用 pthread_detach 时,函数会立即返回,调用线程可以继续执行后续的代码,不会等待目标线程结束。

示例代码

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>void* thread_func(void* arg) {sleep(3); // 模拟线程执行 3 秒printf("子线程执行完毕\n");return NULL;
}int main() {pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);printf("主线程调用 pthread_detach 分离子线程\n");pthread_detach(tid);printf("主线程继续执行其他任务\n");// 主线程继续执行其他操作for (int i = 0; i < 5; i++) {printf("主线程执行中...\n");sleep(1);}return 0;
}

解释

  • 主线程创建子线程后,调用 pthread_detach 分离子线程。
  • pthread_detach 调用后立即返回,主线程不会等待子线程结束,而是继续执行后续的 for 循环,打印信息。
  • 子线程在后台继续执行,当子线程结束时,系统会自动回收其资源。

4.2 资源回收方式

4.2.1 pthread_join 的资源回收与返回值获取

pthread_join 用于主动回收目标线程的资源。当目标线程终止时,pthread_join 会负责释放目标线程所占用的栈空间、线程描述符等资源。同时,通过 pthread_join 的第二个参数,调用者可以获取目标线程的返回值。

示例代码

#include <stdio.h>
#include <pthread.h>void* thread_func(void* arg) {int result = 42;return (void*)&result;
}int main() {pthread_t tid;void* retval;pthread_create(&tid, NULL, thread_func, NULL);pthread_join(tid, &retval);int* result_ptr = (int*)retval;printf("子线程返回值: %d\n", *result_ptr);return 0;
}

解释

  • 子线程 thread_func 计算出结果 42,并将其地址作为返回值。
  • 主线程调用 pthread_join 等待子线程结束,同时将 retval 作为参数传递给 pthread_join
  • 当子线程结束后,pthread_join 会回收子线程的资源,并将子线程的返回值存储在 retval 中。
  • 主线程将 retval 转换为 int* 类型,解引用后得到子线程的返回值并打印。
4.2.2 pthread_detach 的自动资源回收

pthread_detach 使目标线程在终止时自动释放其占用的资源。一旦线程被设置为分离状态,当该线程结束时,系统会自动回收其资源,无需其他线程调用 pthread_join 来回收。但需要注意的是,由于资源自动回收,无法通过 pthread_join 获取分离线程的返回值。

示例代码

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>void* thread_func(void* arg) {sleep(2);printf("子线程执行完毕\n");return NULL;
}int main() {pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);pthread_detach(tid);printf("主线程继续执行,无需等待子线程资源回收\n");sleep(3);return 0;
}

解释

  • 主线程创建子线程后,调用 pthread_detach 将子线程设置为分离状态。
  • 主线程可以继续执行后续代码,无需等待子线程结束。
  • 当子线程结束时,系统会自动回收其资源,主线程无需进行额外的操作。

4.3 线程状态互斥性

4.3.1 线程状态概述

线程有两种主要状态:可结合(joinable)和分离(detached)。新创建的线程默认处于可结合状态,在这种状态下,需要通过 pthread_join 来回收资源。而通过 pthread_detach 可以将线程设置为分离状态。

4.3.2 状态互斥性

一个线程只能处于可结合或分离状态之一,且状态转换是单向的。一旦一个线程被 pthread_detach 设置为分离状态,就不能再被 pthread_join 结合;反之,若一个线程已经被 pthread_join 结合,也无法再被 pthread_detach 分离。

示例代码(尝试对分离线程调用 pthread_join)

#include <stdio.h>
#include <pthread.h>
#include <errno.h>void* thread_func(void* arg) {return NULL;
}int main() {pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);pthread_detach(tid);int ret = pthread_join(tid, NULL);if (ret == EINVAL) {printf("错误:不能对分离线程调用 pthread_join\n");}return 0;
}

解释

  • 主线程创建子线程后,调用 pthread_detach 将子线程设置为分离状态。
  • 然后尝试调用 pthread_join 等待该分离线程,pthread_join 会返回 EINVAL 错误,表示参数无效。这说明不能对分离线程调用 pthread_join

4.4 适用场景对比

4.4.1 pthread_join 的适用场景
  • 需要获取线程执行结果:当主线程需要知道子线程的计算结果、任务完成状态等信息时,使用 pthread_join 可以方便地获取子线程的返回值。
  • 顺序执行依赖:如果主线程的后续操作依赖于子线程的完成,例如需要子线程初始化一些资源后,主线程才能继续执行,使用 pthread_join 可以确保子线程先完成任务。
4.4.2 pthread_detach 的适用场景
  • 无需线程返回值:对于一些后台任务,如日志记录、定时清理等,主线程不需要知道这些线程的执行结果,使用 pthread_detach 可以让这些线程在结束时自动释放资源,减少主线程的管理负担。
  • 高并发场景:在高并发的服务器程序中,为每个客户端请求创建一个线程进行处理。使用 pthread_detach 可以避免主线程为每个子线程调用 pthread_join 而阻塞,提高系统的并发处理能力。

通过对 pthread_join 和 pthread_detach 在阻塞性、资源回收方式、线程状态互斥性以及适用场景等方面的详细对比,新手可以更好地理解这两个函数的区别,从而在实际编程中根据具体需求选择合适的函数来管理线程资源。

五、选择合适的函数

  • 需要获取线程返回值且不介意阻塞:使用 pthread_join。例如,主线程需要等待子线程完成计算任务,并获取计算结果。
  • 无需线程返回值且希望避免阻塞:使用 pthread_detach。例如,后台日志记录线程,主线程不关心其执行结果,只需要确保线程结束后资源被自动回收。

六、总结

pthread_join 和 pthread_detach 是多线程编程中用于线程资源管理的重要函数。理解它们的区别、使用方法和常见易错点,对于编写高效、稳定的多线程程序至关重要。在实际开发中,应根据具体的需求选择合适的函数,以平衡资源管理和程序效率。

相关文章:

嵌入式开发面试常见编程题解析:pthread_join 与 pthread_detach 详解

一、引言 在多线程编程中&#xff0c;线程的资源管理至关重要。pthread_join 和 pthread_detach 是用于线程资源管理的两个重要函数。正确使用它们可以确保线程资源的合理回收&#xff0c;避免出现资源泄漏等问题。本文将详细介绍这两个函数的区别、使用方法、常见易错点以及拓…...

C#里嵌入lua脚本的例子

由于lua脚本比较小,并且适用性很强,非常适合嵌入式系统里加入。 比如在GD32的MCU里运行lua脚本,又者在ESP32里运行它,都是比较方便的。 当脚本要发送给MCU运行之前,我们需要在PC的软件里对脚本进行编译, 以便发现脚本有什么问题,不能在MCU里去发现问题,否则那样会比…...

git配置SSH KEY

1. 生成SSH密钥 ssh-keygen一直按回车 2.查看密钥 去.ssh目录查看生成的密钥文件 .pub结尾的文件即是密钥文件 3.配置SSH KEY 到代码仓库如GitHub&#xff0c;gitlab等配置SSH KEY&#xff0c;将密钥复制上去添加即可...

js day9

js当中与滚动相关的属性 <div>haha</div> <script>let boxdocument.querySelector("div")box.addEventListener("scoll",function(e)){console.log(window.scrolltop) }//往上走了 </script> ,box.scrollHeight——获取元素内容…...

【docker】启动临时MongoDB容器、挂载数据卷运行数据库服务,并通过备份文件恢复MongoDB数据库备份数据

‌启动临时 MongoDB 容器、挂载数据卷运行数据库服务&#xff0c;并通过备份文件恢复数据 1.命令分解与功能说明1.1.启动一个临时 MongoDB 容器‌&#xff0c;并进入交互式终端&#xff08;1&#xff09;执行命令&#xff08;2&#xff09;实现功能‌&#xff08;3&#xff09;…...

20_大模型微调和训练之-基于LLamaFactory+LoRA微调LLama3后格式合并

1. 什么是 GGUF GGUF 格式的全名为(GPT-Generated Unified Format)&#xff0c;提到 GGUF 就不得不提到它的前身 GGML(GPT-Generated Model Language)。GGML 是专门为了机器学习设计的张量库&#xff0c;最早可 以追溯到 2022/10。其目的是为了有一个单文件共享的格式&#xf…...

LLamaFactory如何在Windows系统下部署安装训练(保姆级教程)

注意&#xff1a;以下教程编写和灵感来源均来自eogee开源作者&#xff08;EOGEE_岳极技术_大模型与AI知识技术共享社区&#xff09;&#xff0c;大家有需要学习AI方面的知识可以关注他。 另我个人此次环境部署所用的显卡是5070ti16G显存&#xff0c;系统是Windows11。 如有问题…...

数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记7

前言 在前面文章的介绍中&#xff0c;已经介绍了数据定义、数据更新、数据查询&#xff0c;关于SQL语句的标准语言已经基本上介绍完毕&#xff0c;本文接下来将介绍另外两种便于操作的操作模式——视图与索引。其大致的语句代码与前文其实并无大的区别&#xff0c;在了解基本语…...

【LeetCode】彩灯装饰记录 III

题目 题目链接 一棵圣诞树记作根节点为 root 的二叉树&#xff0c;节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果&#xff1a; 第一层按照从左到右的顺序记录 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右&#xff0c;第二层为从右到左…...

MongoDB的图形化工具robo3t,navicat

MongoDB 常用的两个图形化工具 —— Robo 3T 和 Navicat 的详细介绍、区别和基本使用方法&#xff1a; &#x1f9f0; 一、Robo 3T&#xff08;原 Robomongo&#xff09; &#x1f4cc; 简介 Robo 3T 是一款专注于 MongoDB 的轻量级可视化客户端。由原 Robomongo 团队开发&am…...

python celery框架结合django的使用

学习目标&#xff1a; 通过文章了解celery的运行机制以及如何结合django去使用 熟悉celery的运行原理属性celery在django项目当中的配置如何启动运行celery框架 学习内容&#xff1a; 熟悉celery的运行原理&#xff0c;简单来说 Celery 是一个“任务排队机后台处理器”。帮你…...

Ansible 守护 Windows 安全(Ansible Safeguards Windows Security)

Ansible 守护 Windows 安全&#xff1a;自动化基线检查与加固 在当今网络威胁日益严峻的形势下&#xff0c;保障 Windows 系统安全至关重要。Ansible 作为一款强大的自动化运维工具&#xff0c;可通过自动化脚本实现 Windows 安全基线检查和加固&#xff0c;大幅提升运维效率并…...

【计算机架构】CISC(复杂指令集计算机)架构

一、引言 在计算机技术领域中&#xff0c;计算机架构是基石&#xff0c;决定着计算机系统的性能、功能和效率。CISC&#xff08;复杂指令集计算机&#xff09;架构作为一种经典的计算机架构&#xff0c;自诞生以来就在计算机发展历程中扮演着举足轻重的角色。从早期的大型计算机…...

【学习资源】知识图谱与大语言模型融合

知识图谱与大型语言模型结合参数知识和明确知识的可用性会带来一些机会和愿景。分享一些知识图谱和大语言模型融合的论文和文章、实践案例、关键技术和实用工具。 1 模型库获取 https://modelscope.cn/models 注 下载模型需运行 git lfs instal 2 论文和文章 2.1 大型语言模…...

探索微服务入口:Spring Cloud Gateway 实战指南

在微服务架构中&#xff0c;网关&#xff08;Gateway&#xff09;扮演着“请求入口”的角色。它不仅帮助我们统一入口、路由转发&#xff0c;还可以承担限流、安全认证、权限校验、熔断等功能。 本文将系统介绍 Spring Cloud Gateway 的基础概念、快速上手指南&#xff0c;以及…...

python的turtle库实现四叶草

实现代码&#xff1a; import turtle turtle.pencolor(‘green’) turtle.fillcolor(‘green’) turtle.begin_fill() turtle.circle(100,90) turtle.left(90) turtle.circle(100,90) turtle.right(180) turtle.circle(100, 90) turtle.left(90) turtle.circle(100,90) tu…...

医疗生态全域智能化:从技术革新到价值重塑的深度探析

引言 医疗人工智能正在经历从单一技术应用向全域生态系统演进的关键转折点。随着深度学习、自然语言处理和计算机视觉等技术的成熟,AI不再局限于辅助诊断等单一功能,而是逐渐渗透到医疗健康服务的全生命周期。从传统设备制造商向智慧医疗转型的东软医疗,正在构建"AI大…...

Rust 的 Web 世界:actix_web 轻松接收 JSON 请求体

前言 在现代 Web 世界,数据传输早已从“你问我答”的问卷时代,迈入“你扔我接”的快节奏赛道。其中最火的“传球”方式,非 JSON 请求体莫属。Rust 这门以高性能和强类型著称的语言,也不甘人后,推出 actix_web 框架,力求在 Web 世界中杀出一条血路。 今天我们不讲玄学,…...

1.3 点云数据获取方式——ToF相机

图1-3-1TOF相机 ToF 相机作为新兴的 3D 感知设备,凭借独特的技术优势崭露头角。其工作原理基于光飞行时间(Time of Flight)技术,通过测量光信号从发射到被物体反射后返回传感器的时间差,直接且快速地获取物体的深度信息。这种直接测量深度的方式使得 ToF 相机具备…...

数据结构每日一题day13(链表)★★★★★

题目描述&#xff1a;采用尾插法在头指针L处建立一个带头结点的单链表,输入-1表示结束结果返回建立的单链表。 算法思想&#xff1a; 1.初始化链表&#xff1a;创建一个头结点&#xff08;不存储实际数据&#xff09;&#xff0c;头指针 L 指向该头结点。初始时&#xff0c;头…...

【网络编程】UDP协议 和 Socket编程

1. UDP的特点 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是互联网协议套件中的一种传输层协议&#xff0c;与广泛使用的TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;相比&#xff0c;它是一种无连接…...

【探寻C++之旅】第十二章:异常

请君浏览 前言1.异常的概念2.异常的使用2.1 抛出与捕获2.2 栈展开2.3 查找匹配的处理代码2.4 简单的异常使用2.5 异常重新抛出 2. 异常的安全问题3. 异常的规范4. 标准库的异常5. 异常处理建议尾声 前言 今天&#xff0c;我们继续踏入追寻C的冒险历程。今天我们让我们来讲讲C中…...

CSS的三大特性:层叠、继承与优先级

CSS作为网页设计的核心语言&#xff0c;其三大核心特性——层叠性、继承性和优先级共同构成了样式表现的底层逻辑。理解这些特性将帮助开发者写出更优雅、更易维护的样式代码。 一、层叠性&#xff08;Cascading&#xff09; 1.1 核心概念 "层叠"指多个样式规则同…...

Spring Cloud 项目中优雅地传递用户信息:基于 Gateway + ThreadLocal 的用户上下文方案

在 Spring Cloud 微服务架构中&#xff0c;我们通常使用 API 网关&#xff08;如 Spring Cloud Gateway&#xff09;作为流量入口&#xff0c;负责统一的用户身份校验和请求路由。本文将介绍一种通用的用户信息传递方案&#xff1a;网关完成认证后通过请求头传递用户信息&#…...

node.js 实战——mongoDB 续一

mongoDB的基本指令 进入mongodb mongo显示当前的所有数据库 show dbs # 或者 show databases切换数据库/进入指定数据库 使用这个命令的时候&#xff0c;是不要求这个数据库是否创建 use 数据库名显示当前数据库 db显示数据库中所有集合 show collections数据库的CRUD的…...

鸟笼效应——AI与思维模型【84】

一、定义 鸟笼效应思维模型指的是人们在偶然获得一件原本不需要的物品后,会为了这件物品的配套或使用需求,进而继续添加更多与之相关但自己原本可能并不需要的东西,仿佛被这个“鸟笼”牵着走,最终陷入一种惯性消费或行为模式的现象。简单来说,就是人们在心理上会有一种自…...

豪越科技消防立库方案:实现应急物资高效管理

在消防救援工作中&#xff0c;应急物资管理是至关重要的一环。然而&#xff0c;当前应急物资管理的现状却令人担忧。传统的应急物资管理方式存在诸多弊端&#xff0c;严重影响了消防救援的效率和效果。 走进一些传统的消防仓库&#xff0c;映入眼帘的往往是杂乱无章的存储场景。…...

简化excel校验提高开发效率

业务背景&#xff1a;上传excel文件进行基础数据校验&#xff0c;然而东西太多写着写着就...自然成了测试的KPI了 解决思路&#xff1a;使用现有的注解处理&#xff0c;原理使用validate注解原理 直接上干货&#xff0c;一行代码搞定校验&#xff1a; ValidateUtils.validat…...

ElasticSearch深入解析(六):集群核心配置

1.开发模式和生产模式 Elasticsearch默认运行在开发模式下&#xff0c;此模式允许节点在配置存在错误时照常启动&#xff0c;仅将警告信息写入日志文件。而生产模式则更为严格&#xff0c;一旦检测到配置错误&#xff0c;节点将无法启动&#xff0c;这是一种保障系统稳定性的安…...

Python 重构“策略”模式:用函数简化设计模式的实践

在软件设计中&#xff0c;设计模式是解决问题的通用模板。但随着编程语言特性的发展&#xff0c;某些经典模式可以通过更简洁的方式实现。本文以电商促销折扣场景为例&#xff0c;演示如何通过函数重构“策略”模式&#xff0c;减少代码量并提升可维护性。 经典策略模式实现 …...

​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡

MCP协议深度解析&#xff1a;原理、应用与物联网时代的机遇-优雅草卓伊凡 一、MCP协议技术详解 1.1 MCP协议的定义与起源 MCP&#xff08;Modbus Communication Protocol&#xff09;是一种基于主从架构的串行通信协议&#xff0c;最初由Modicon公司&#xff08;现为施耐德电…...

IOS 国际化词条 Python3 脚本

一、词条处理脚本---使用教程 (1)环境篇 1: 该脚本基于python3 环境&#xff0c;请确保你的mac 安装了python3 2: 包依赖&#xff0c;请在python3环境下安装 xlrd; pip3 install xlrd(2)使用篇 1: 桌面创建一个文件夹, 例如 wordEntry,将该脚本文件与下载的最新的 ’词条.xlsx‘…...

uniapp 支付宝小程序自定义 navbar 无效解决方案

如图&#xff1a; uniapp编译到支付宝小程序隐藏默认的导航栏失效了 解决方案&#xff1a; 在 pages.json 文件中找到 globalStyle 中加入以下代码&#xff1a; "mp-alipay": {"transparentTitle": "always","titlePenetrate":…...

uni-app - 微信小程序中,使用 navigateTo 传递非常大的数字传参精度丢失的问题

文章目录 🍉原因分析:JavaScript 数值精度限制🍉常用解决方法🍉代码示例🍉官方推荐与最佳实践🍉微信小程序环境注意事项🍉原因分析:JavaScript 数值精度限制 微信小程序(uni-app)中,参数是通过 URL 查询字符串传递的,其本质上仍由 JavaScript 进行处理。Jav…...

通信施工安全员B证适合哪些人考

通信施工安全员B证适合人群分析 一、适用岗位范围 通信工程施工人员 从事基站建设、光缆布放、管道施工等现场作业的技术工人 5G网络建设、室内分布系统安装等新型基础设施建设人员 项目管理岗位 通信工程项目经理、技术负责人 施工队长、班组长等现场管理人员 专职安全…...

vue3使用<el-date-picker分别设置开始时间和结束时间时,设置开始时间晚于当前时间,开始时间早于结束时间,结束时间晚于开始时间

vue3使用<el-date-picker分别设置开始时间和结束时间时&#xff0c;设置开始时间晚于当前时间&#xff0c;开始时间早于结束时间&#xff0c;结束时间晚于开始时间 为避免出现填写结束事件后再次修改开始时间&#xff0c;导致开始时间晚于结束时间&#xff0c;添加 change“…...

移远通信LG69T赋能零跑B10:高精度定位护航,共赴汽车智联未来

当前&#xff0c;汽车行业正以前所未有的速度迈向智能化时代&#xff0c;组合辅助驾驶技术已然成为车厂突出重围的关键所在。高精度定位技术作为实现车辆精准感知与高效协同的基石&#xff0c;其重要性日益凸显。 作为全球领先的物联网及车联网整体解决方案供应商&#xff0c;移…...

HTML应用指南:利用POST请求获取全国达美乐门店位置信息

达美乐比萨作为全球知名的披萨连锁品牌&#xff0c;自1960年创立以来&#xff0c;始终致力于为消费者提供高品质、快速配送的披萨体验。在中国市场&#xff0c;达美乐凭借其“30分钟必达”的承诺和经典美式风味&#xff0c;逐渐赢得了广大消费者的青睐。品牌通过不断拓展门店网…...

进程优先级以及切换调度

目录 进程优先级 基本概念 实操理解 优先级操作 竞争&#xff0c;独立&#xff0c;并行&#xff0c;并发 进程切换 寄存器 讲切换 linux进程调度算法 进程优先级 基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优…...

揭开应用程序的神秘面纱:深入了解 AWS X-Ray

1.AWS X-Ray 概述&#xff1a; AWS X-Ray 是一项服务&#xff0c;它收集应用程序所处理请求的数据&#xff0c;并提供一些工具供您查看、筛选和深入了解这些数据&#xff0c;从而发现问题和优化机会。您不仅可以查看请求和响应的详细信息&#xff0c;还可以查看应用程序对下游…...

元宇宙2.0:当区块链成为数字世界的宪法

引言&#xff1a;当虚拟世界成为“新大陆” 清晨&#xff0c;你戴上VR设备进入一个由数字建筑构成的城市&#xff0c;这里的地皮属于全球玩家&#xff0c;街边的艺术品标着NFT认证码&#xff0c;咖啡馆里的人们用加密货币支付咖啡&#xff0c;而社区规则由持有代币的居民投票决…...

JVM调优实战(JVM Tuning Pactice)

JVM调优实战 JVM调优 JVM调优是指对Java虚拟机进行性能优化的实际应用。 JVM调优实战主要是通过优化JVM的内存管理、垃圾回收、线程管理、类加载、编译器等方面来提高Java应用程序的性能和稳定性。 JVM调优步骤 JVM调优实战通常需要经过以下步骤&#xff1a; 1.监控GC的状…...

网络原理 - 11(HTTP/HTTPS - 2 - 请求)

目录 HTTP 请求&#xff08;Request&#xff09; 认识 URL URL 基本格式 关于 URL encode 认识方法&#xff08;method&#xff09; 1. GET 方法 2. POST 方法 认识请求“报头”&#xff08;header&#xff09; Host Content-Length Content-Type User-Agent&…...

百度CarLife实现手机车机无缝互联

百度CarLife是百度推出的智能车联网解决方案&#xff0c;通过手机与车机互联技术&#xff0c;为用户提供安全便捷的车载互联网服务体验。 CarLife 实现手机与车机屏幕的无缝互联&#xff0c;让应用内容同步至车载系统&#xff0c;减少驾驶过程中操作手机的频率&#xff0c;提升…...

初识Redis · 缓存

目录 前言&#xff1a; 引入缓存 缓存更新策略 定期生成 实时生成 缓存注意事项 缓存预热 缓存穿透 缓存雪崩 缓存击穿 前言&#xff1a; 我们在Redis的学习中&#xff0c;逐渐了解到了Redis的用途是可以用来当作内存数据库&#xff0c;缓存&#xff0c;消息队列等&…...

Redis性能优化终极指南:从原理到实战的深度调优策略

一、内存优化&#xff1a;构建高效存储体系 1.1 三级过期键管理机制 Redis通过组合策略实现精准的内存回收&#xff1a; 定时删除&#xff08;主动淘汰&#xff09; 创建定时器在键到期时立即删除 优点&#xff1a;及时释放内存 缺点&#xff1a;高CPU消耗&#xff08;每个…...

哈希表笔记(一 )

设计思路 核心功能和 API 设计 (Core Functionality & API Design): 基本操作: 必须提供核心的 put(key, value)&#xff08;添加或更新键值对&#xff09;、get(key)&#xff08;根据键获取值&#xff09;、remove(key)&#xff08;根据键删除键值对&#xff09;、contain…...

c网络库libevent的http常用函数的使用(附带源码)

Libevent HTTP 核心函数详解与实战 核心概念HTTP 服务器端常用函数1. 初始化与绑定2. 设置请求处理回调3. 在回调函数中处理请求4. 发送响应5. 启动与停止6. 清理资源 HTTP 客户端常用函数1. 初始化2. 创建连接3. 创建并发送请求4. 在回调函数中处理响应5. 启动事件循环与清理 …...

java练习3

随机生成20个数字&#xff08;随机种子&#xff09; 分别使用冒泡排序、二叉树排序、插入排序进行排序 并输出最终结果以及三种排序使用的时间 package a01_第一次练习.a03_排序;import java.time.Duration; import java.time.LocalDateTime; import java.util.TreeSet;publi…...

当 AI 成为 “数字新物种”:人类职业的重构与进化

一、AI 的 “替代清单”&#xff1a;从流水线到办公室的全面侵袭 在深圳某智能工厂&#xff0c;机械臂正以 0.01 毫米的精度完成手机组装&#xff0c;100 台机器人 24 小时运转&#xff0c;替代了 3000 名工人。这种场景正在全球制造业蔓延 —— 麦肯锡预测&#xff0c;到 203…...