线程控制(创建、终止、等待、分离)
目录
1.前言
2.创建线程
pthread_create函数
3.线程终止
pthread_exit函数
pthread_cancel函数
4.线程等待
5.线程分离
1.前言
在Linux系统中,并不存在真正的线程,只有轻量级进程。所以,Linux系统只提供了操作轻量级进程的系统调用接口,并不提供直接操作线程的系统调用接口。但是,对于用户来说,用户想要对线程进行操作,只认线程相关的接口。于是,有人对轻量级进程的系统调用接口进行封装,转换成线程相关的接口语义给用户使用。
封装其实就是封装成库,这个库被叫做Linux的原生线程库:
- 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”开头。
- 要使用这些函数库,要通过引入头文<pthread.h>。
- 链接这些线程函数库时要使用编译器命令的“-lpthread”选项
2.创建线程
pthread_create函数
pthread库中创建线程的函数为pthread_create,创建出的新线程和主线程谁先运行时不确定的,由调度器说了算。
功能:用于创建一个新的线程。
函数原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void*), void *arg);
参数:
pthread_t *thread:
这是一个输出型参数,用于存储新线程的标识符(线程ID)。线程创建成功后,系统会将线程ID写入该指针指向的内存。原生线程库中还提供了一个让线程获取自己的线程id的方法:pthread_t pthread_self(void)
const pthread_attr_t *attr:
指向线程属性的指针,用于设置线程的属性(如栈大小、调度策略等),如果为NULL
,则使用默认属性。
void *(*start_routine) (void *)
:
线程启动后执行的函数指针。该函数必须返回
void *
并接受一个void *
类型的参数。线程从该函数的起始处开始执行,函数返回时线程终止。
void *arg:
传递给start_routine
函数的参数。如果需要传递多个参数,可以将它们封装在一个结构体中,然后传递结构体的指针。返回值:
成功:返回
0
。失败:返回错误码(非零值),常见的错误码包括:
EAGAIN
:系统资源不足,无法创建线程。
EINVAL
:线程属性无效。
EPERM
:没有权限设置调度策略或参数。
使用示例:
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;void* handler(void* arg)
{int cnt = 5;while(cnt--){cout << "I am a thread" << endl;sleep(1);}return nullptr;
}int main()
{pthread_t thread_id = 0;int ret = pthread_create(&thread_id, NULL, handler, NULL);if(ret != 0){cout << "create error" << endl;}sleep(6);return 0;
}
运行结果:
当我们的代码创建出一个线程之后,新线程就会和主线程并发执行自己的代码。如果主线程先退,表示进程退出,新线程也会结束,如果新线程先结束,主线程不会直接结束,会等自己的代码运行完之后再结束。
3.线程终止
终止一个线程的方法有三种:
- return:使用return语句退出。
- pthread_exit:线程可以调用pthread_exit函数终止自己。
- pthread_cancel:一个线程可以调用pthread_cancel终止同一进程中的另一个线程。
pthread_exit函数
功能:终止当前进程的执行。
函数原型:void pthread_exit(void *retval)
参数:
void *retval
:
线程的返回值,通常是一个指向某个数据的指针。
如果不需要返回值,可以传递
NULL
。该返回值可以被其他线程通过
pthread_join
获取。返回值:该函数没有返回值。
需要注意:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时,线程函数已经退出了。
使用示例:
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;void* handler(void* arg)
{int cnt = 3;while(cnt--){cout << "I am a thread" << endl;sleep(1);if(cnt == 1){cout << "called pthead_exit" << endl;pthread_exit(NULL);}}return nullptr;
}int main()
{pthread_t thread_id = 0;int ret = pthread_create(&thread_id, NULL, handler, NULL);if(ret != 0){cout << "create error" << endl;}sleep(5);return 0;
}
运行结果:
pthread_cancel函数
功能:用于请求取消(终止)指定的线程。
函数原型:int pthread_cancel(pthread_t thread)
参数:
pthread_t thread:
目标线程的标识符(线程ID),即需要取消的线程。返回值:
成功:返回
0
。失败:返回错误码(非零值)。
使用示例:
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;void* handler(void* arg)
{int cnt = 10;while(cnt--){cout << "new thread say: I am runnig" << endl;sleep(1);}return nullptr;
}int main()
{pthread_t tid = 0;int ret = pthread_create(&tid, NULL, handler, NULL);if(ret != 0){cout << "create thread error" << endl;}cout << "create thread success" << endl;sleep(5);ret = pthread_cancel(tid);if(ret != 0){cout << "cancel thread error" << endl;}cout << "cancel thread success" << endl;return 0;
}
运行结果:
4.线程等待
在进程控制中,如果一个子进程退出,父进程需要对子进程进行回收,也就是需要进行进程等待,不然就会造成僵尸进程而引发资源泄漏问题;在线程这里,一个线程退出后,主线程需要对其进行回收,不然也会产生类似的问题。
- 已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。
- 创建新的线程不会复用刚才退出线程的地址空间。
pthread_join函数
功能:用于等待指定的线程终止,并获取该线程的返回值。
函数原型:int pthread_join(pthread_t thread, void **value_ptr)
参数:
thread
: 要等待的线程的标识符(pthread_t
类型)。
value_ptr
: 指向一个指针的指针,用于存储目标线程的返回值。如果不需要返回值,可以设置为NULL
。返回值:
成功时返回
0
。失败时返回一个错误码(非零值),常见的错误码包括:
ESRCH
: 没有找到与指定线程 ID 对应的线程。
EINVAL
: 线程是分离的(detached)或者已经有其他线程在等待它。
EDEADLK
: 检测到死锁(例如,线程试图等待自己)。需要注意:
调用该函数的线程将挂起等待,直到id为thread的线程终止。
thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:
- 1. 如果thread线程通过return返回,value_ ptr所指向的单元里存放的是thread线程函数的返回值。
- 2. 如果thread线程被别的线程调用pthread_ cancel异常终掉,value_ ptr所指向的单元里存放的是常数 —— PTHREAD_ CANCELED。
- 3. 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。
- 4. 如果对thread线程的终止状态不感兴趣,可以传NULL给value_ ptr参数。
使用示例:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>void* thread_function(void* arg) {int* value = (int*)arg;printf("Thread is running with value: %d\n", *value);int* result = (int*)malloc(sizeof(int));*result = *value * 2;pthread_exit(result);
}int main() {pthread_t thread;int value = 10;int* retval;if (pthread_create(&thread, NULL, thread_function, &value) != 0) {perror("pthread_create");exit(EXIT_FAILURE);}if (pthread_join(thread, (void**)&retval) != 0) {perror("pthread_join");exit(EXIT_FAILURE);}printf("Thread returned: %d\n", *retval);free(retval);return 0;
}
运行结果:
5.线程分离
默认情况下,新创建的线程是需要等待的,新线程退出后,需要主线程对其进行pthread_join操作,否则无法释放资源,从而造成系统资源泄漏。如果不关心线程的返回值,等待就是一种负担,这个时候,我们可以将该线程分离,当线程退出时,操作系统会自动释放被分离的线程的资源。
注意:线程分离只是主线程不用等待新线程的退出了,并不是把新线程剥离下来了。
pthread_detach函数
功能:用于将指定的线程标记为“分离状态”,分离状态的线程在终止时会自动释放其资源,而不需要其他线程调用
pthread_join
来回收资源。函数原型:int pthread_detach(pthread_t thread)
参数:
thread:
要分离的线程的标识符(pthread_t
类型)返回值:
成功时返回
0
。失败时返回一个错误码(非零值),常见的错误码包括:
ESRCH
: 没有找到与指定线程 ID 对应的线程。
EINVAL
: 线程已经是分离状态,或者线程已经终止。注意:
- 一旦线程被分离,就不能再调用
pthread_join
来等待它,否则会导致未定义行为- 线程分离,可以是线程组内其他线程对目标线程进行分离,也可以是线程自己将自己分离。
使用示例:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>void* thread_function(void* arg) {int* value = (int*)arg;printf("Thread is running with value: %d\n", *value);sleep(2); // 模拟线程执行一些任务printf("Thread is exiting\n");pthread_exit(NULL);
}int main() {pthread_t thread;int value = 10;if (pthread_create(&thread, NULL, thread_function, &value) != 0) {perror("pthread_create");exit(EXIT_FAILURE);}// 分离线程if (pthread_detach(thread) != 0) {perror("pthread_detach");exit(EXIT_FAILURE);}printf("Main thread continues to run...\n");sleep(3); // 确保分离的线程有足够时间完成return 0;
}
运行结果:
相关文章:
线程控制(创建、终止、等待、分离)
目录 1.前言 2.创建线程 pthread_create函数 3.线程终止 pthread_exit函数 pthread_cancel函数 4.线程等待 5.线程分离 1.前言 在Linux系统中,并不存在真正的线程,只有轻量级进程。所以,Linux系统只提供了操作轻量级进程的系统调用…...
秒杀系统的常用架构是什么?怎么设计?
架构 秒杀系统需要单独部署,如果说放在订单服务里面,秒杀的系统压力太大了就会影响正常的用户下单。 常用架构: Redis 数据倾斜问题 第一步扣减库存时 假设现在有 10 个商品需要秒杀,正常情况下,这 10 个商品应该均…...
2025年生成式人工智能应用工程师学习线路
生成式人工智能应用工程师学习线路 初级 掌握AIGC基础概念、法律规范及安全基础、提示词使用及优化技巧,具备使用文心一言、Stable Diffsion、Midjourney等常见大模型应用进行高质量的文案、图片、视频创作的能力 课程内容包括:AIGC基础、职业道德、数…...
python力扣3:无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”…...
文生图开源模型发展史(2014-2025年)
文生图开源模型的发展历程是一段充满技术革新、社区生态繁荣与商业化竞争的多维度演进史。 一、技术萌芽期(2014-2020年) 核心突破 2014年:GAN(生成对抗网络)诞生,首次实现数据驱动式图像生成࿰…...
fastadmin 后台商品sku(vue)
先上个效果图 首先先引入vue define([backend], function (Backend) {require.config({paths: {vue: /assets/jeekshopskugoods/libs/vue.min,skuimg: /assets/jeekshopskugoods/js/skuimg,skugoods: /assets/jeekshopskugoods/js/skugoods,layui: /assets/LayuiSpzj/layui/la…...
Qt显示一个hello world
一、显示思路 思路一:通过图形化方式,界面上创建出一个控件显示。 思路二:通过编写C代码在界面上创建控件显示。 二、思路一实现 点开 Froms 的 widget.ui,拖拽 label 控件,显示 hello world 即可。 qmake 基于 .…...
LeetCode 热题 100 53. 最大子数组和
LeetCode 热题 100 | 53. 最大子数组和 大家好,今天我们来解决一道经典的算法题——最大子数组和。这道题在 LeetCode 上被标记为中等难度,要求我们找出一个具有最大和的连续子数组,并返回其最大和。下面我将详细讲解解题思路,并…...
需求: 使用 minio 做一个 企业微信对话的下载、存储,利用deepseek进行对话回复
以下是基于企业微信会话存档API和MinIO对象存储实现对话记录下载与存储的完整方案,涵盖技术选型、接口对接、存储配置及安全性设计等核心环节: 一、技术架构设计 系统组成: 数据采集层:通过企业微信API拉取会话存档数据࿰…...
vulnhub靶场之【digitalworld.local系列】的bravery靶机
前言 靶机:digitalworld.local-bravery,IP地址为192.168.10.8 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机采用virtualbox虚拟机,网卡都为桥接模式 这里官方给的有两种方式,…...
JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)
JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式) 一、项目背景 在软件测试过程中,使用 JMeter 进行性能测试和功能测试是常见的操作。本实战项目将详细介绍如何使用 JMeter 自带工具以及 BadBoy 进行脚本录制,并完善脚本以…...
数据库基础五(数据库环境变量配置详细教程)
1、在小皮的设置界面检测3306端口,保障3306端口可用; 2、在小皮的首面界面,启动MySQL; 3、进行环境变量设置,找到MySQL的路径,进行复制; 4、在Windows的搜索栏内,输入“环境变量”&a…...
Matlab 大量接单
分享一个matlab接私活、兼职的平台 1、技术方向满足任一即可 2、技术要求 3、最后 技术方向满足即可 MATLAB:熟练掌握MATLAB编程语言,能够使用MATLAB进行数据处理、机器学习和深度学习等相关工作。 机器学习、深度学习、强化学习、仿真、复现、算法、…...
【算法】链表题型总结
链表题型可分为快慢指针和虚拟头节点两种解题技巧。 快慢指针 使用两个指针(快指针和慢指针),以不同的速度遍历链表,解决与链表位置、环检测相关的问题。 反转链表 快慢指针,慢指针一次走一步,快指针一次…...
【C++】对字符串的常用操作
C 中的字符串操作主要通过两种方式实现:使用 C 风格的字符串(字符数组)和使用 C 标准库中的 std::string 类型。大多数现代 C 程序使用 std::string 进行字符串处理,因为它提供了许多便捷的成员函数来处理字符串操作。以下是常见的…...
人工智能AI在汽车设计领域的应用探索
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
Linux mkdir 命令
Linux mkdir(英文全拼:make directory)命令用于创建目录。 语法 mkdir [-p] dirName 参数说明: -p 确保目录名称存在,不存在的就建一个。 实例 在工作目录下,建立一个名为 runoob 的子目录 : mkdir …...
gin框架学习笔记
初始gin package mainimport "github.com/gin-gonic/gin"type Response struct {Code int json:"code"Msg string json:"msg"Data any json:"data" }func index(c *gin.Context) {c.JSON(200, Response{Code: 0,Msg: "1…...
什么是预训练语言模型下游任务?
问题:Word2Vec模型是预训练模型吗? 由于训练的特性,word2Vec模型一定是与训练模型。给定一个词先使用独热编码然后使用预训练好的Q矩阵得到这个词的词向量。这里指的是词向量本身就是预训练的语言模型。 什么是下游任务? 在自然…...
cursor 弹出在签出前,请清理仓库工作树 窗口
问题出现的背景:是因为我有两台电脑开发,提交后,另一个电脑的代码是旧的,这个时候我想拉取最新的代码,就会出现如下弹窗,因为这个代码暂存区有记录或者工作区有代码的修改,所以有冲突࿰…...
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth,可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...
Ubuntu20.04安装Redis
目录 切换到root用户 使用 apt install redis 安装redis 修改配置文件 编辑 重新启动服务器 使用Redis客户端连接服务器 切换到root用户 如果没有切换到root用户的,切换到root用户。 使用 apt install redis 安装redis 遇到y/n直接y即可。 redis安装好之…...
【Word2Vec】Skip-gram 的直观理解(深入浅出)
01 什么是skip-gram 一句话来说就是,给定中心词,然后预测其周围的词: 02 模型结构 对于skip-gram来说,输入是一个[1 x V]维的ont-hot向量,其中V为词表大小,值为1的那一项就表示我们的中心词。经过一个[V x…...
MQ 笔记
什么是消息队列? 消息队列(Message Queue, MQ)是一种用于在分布式系统中传递消息的中间件技术。 它允许应用程序通过发送和接收消息进行异步通信。 消息队列的核心思想是解耦生产者和消费者,生产者将消息发送到队列中ÿ…...
leetcode第216题组合总和Ⅲ
原题出于leetcode第216题https://leetcode.cn/problems/combination-sum-iii/description/题目为: 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表…...
【零基础C语言】第四节 数组
【零基础C语言系列】 【零基础C语言】第一节 C语言概述【数制进制码制】-CSDN博客 【零基础C语言】第二节 数据类型、运算符、表达式-CSDN博客 【零基础C语言】第三节 控制结构-CSDN博客 一、一维数组...
20250225-代码笔记03-class CVRPModel AND other class
文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…...
京准电钟快讯:NTP时钟同步服务在智造行业应用
京准电钟快讯:NTP时钟同步服务在智造行业应用 京准电钟快讯:NTP时钟同步服务在智造行业应用 一、NTP技术概述 基本原理 NTP(Network Time Protocol)是一种用于同步计算机系统时间的网络协议,通过分层时钟源ÿ…...
【Qt】详细介绍如何在Visual Studio Code中编译、运行Qt项目
Visual Studio Code一只用的顺手,写Qt的时候也能用VS Code开发就方便多了。 理论上也不算困难,毕竟Qt项目其实就是CMake(QMake的情况这里就暂不考虑了)项目,VS Code在编译、运行CMake项目还是比较成熟的。 这里笔者打…...
jsherp importItemExcel接口存在SQL注入
一、漏洞简介 很多人说管伊佳ERP(原名:华夏ERP,英文名:jshERP)是目前人气领先的国产ERP系统虽然目前只有进销存财务生产的功能,但后面将会推出ERP的全部功能,有兴趣请帮点一下 二、漏洞影响 …...
Node.js, Bun, Deno 比较概述
以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl(Node.js 原作者)Jarred Sumner运行时引擎V8(Chrome)V8(Chrome)JavaScriptCore&#…...
大白话跨域问题怎么破,解决方法有啥?
大白话跨域问题怎么破,解决方法有啥? 啥是跨域问题 咱先说说啥是跨域。你可以把每个网站想象成一个独立的小房子,每个房子都有自己的地址(也就是域名)。正常情况下,一个房子里的东西只能在这个房子里用&a…...
DeepSeek R1满血+火山引擎详细教程
DeepSeek R1满血火山引擎详细教程 一、安装Cherry Studio。 Cherry Studio AI 是一款强大的多模型 AI 助手,支持 iOS、macOS 和 Windows 平台。可以快速切换多个先进的 LLM 模型,提升工作学习效率。下载地址 https://cherry-ai.com/ 认准官网,无强制注册。 这…...
Pytorch中的ebmedding到底怎么理解?
在 PyTorch 中,nn.Embedding 是一个用于处理离散符号映射到连续向量空间的模块。它通常用于自然语言处理(NLP)任务(如词嵌入)、处理分类特征,或任何需要将离散索引转换为密集向量的场景。 核心理解 功能&am…...
【JAVA面试题】什么是面向对象?谈谈你对面向对象的理解。
【JAVA面试题】什么是面向对象?谈谈你对面向对象的理解 在 Java 面试中,面向对象 是一个高频考点。它不仅是一种编程思想,更是现代软件开发的核心方法论。本文将从 面向对象的概念、与面向过程的对比、以及 面向对象的三大特性(封…...
【C】链式二叉树算法题1 -- 单值二叉树
leetcode链接https://leetcode.cn/problems/univalued-binary-tree/description/ 1 题目描述 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1࿱…...
基于单片机的GPS定位系统设计
1 系统硬件 1.1单片机模块 单片机的种类和型号可以说是有成百上千种,很多大的公司和企业都生产开发自己的单片机芯片,并且广泛应用于各种产品。Intel、 philips、 摩托罗拉、凌阳、宏晶等等种类繁多。大体上可以分为51系列单片机和非51系列单片机。 其…...
[React]Render Props、自定义Hooks和Context API优化详解
关于React中的Render Props、自定义Hooks和Context API优化的详解。我需要根据我搜索到的资料来综合回答这三个部分。首先,我需要分别理解每个概念的定义、用途以及优化方法。 首先看Render Props。根据Render Props是一种通过传递函数作为prop来共享组件间逻辑的技…...
关于大型语言模型的结构修剪
本文介绍了一种名为 **LLM-Pruner** 的方法,用于对大型语言模型(LLMs)进行结构化剪枝,以减少模型大小和计算需求,同时保留其多任务解决和语言生成能力。LLM-Pruner 通过依赖检测和重要性估计实现高效剪枝,并…...
【语法】C++中string类中的两个问题及解答
贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中,调用的是这个string对象的容量(可以存多少个有效字符),而size()是调用的string对象现在有…...
Linux(centOS) 命令提示符格式修改(PS1)
1. 命令提示符的组成 命令提示符(PS1)通常由以下部分组成: 部分示例说明[ 和 ][...]提示符的开头和结尾,用于视觉分隔。用户名root 或 tianjiajie当前登录的用户。root 是超级用户,普通用户可能是其他名称。分隔用户…...
QwenVL 2.5-本地安装编译布署全教程
开篇 DeepSeek开源后我国又开源了一个震撼大模型,QwenVL2.5,这是一个多模态的模形,它可以认图、识图、更能作图,还能读懂video。 Qwen2.5-VL 的主要特点如下所示: 感知更丰富的世界:Qwen2.5-VL 不仅擅长识别常见物体,如花、鸟、鱼和昆虫,还能够分析图像中的文本、图表…...
Hutool - JWT:轻松玩转 JSON Web Token
各位开发者朋友们,在现代的前后端分离开发模式里,身份验证和授权可是至关重要的环节。JSON Web Token(JWT)作为一种轻量级的身份验证和授权机制,在很多项目中都得到了广泛应用。它可以在客户端和服务器之间安全地传输信…...
2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析《更新中》
文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题D:回文数组试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需…...
【2025年2月28日稳定版】小米路由器4C刷机Immortalwrt 23.05.4系统搭载mentohust 0.3.1插件全记录
小米路由器4C刷机Immortalwrt系统搭载mentohust插件全记录 首先将路由器按住后面的reset,用一个针插进去然后等待5s左右,松开,即可重置路由器。 然后要用物理网线物理连接路由器Lan口和电脑,并将路由器WAN口连接至网口。确保电脑…...
W3C标准和ES规范之一文通
W3C标准和ES规范之一文通 以下是关于W3C标准和ES规范的透彻解析,通过结构化对比和生活化类比帮助理解和记忆: 一、核心概念对比(总览) 维度W3C标准ES规范(ECMAScript)定位Web技术的建筑蓝图JavaScript的语…...
Linux:应用层协议
协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢? 无论我们采用什么方案, 只要保证, 一端发送时构造的数据, 在另一端能够正确的进行解析, 就是ok的. 这种…...
深度学习五大模型:CNN、Transformer、BERT、RNN、GAN详细解析
# 深度学习五虎将:当CNN遇见Transformer的奇幻漂流 ## 序章:AI江湖的兵器谱排行 2012年,多伦多大学的厨房里,Hinton的学生们用GPU煎了个"AlexNet"荷包蛋,从此开启了深度学习的热兵器时代。如今五大模型各显…...
微服务组件详解——sentinel
1.启动sentinel: 下载jar sentinel-dashboard-1.8.0.jar 使用以下命令直接运行 jar 包(JDK 版本必须≥ 1.8): java -Dserver.port9999 -jar D:\sentinel-dashboard-1.8.0.jar 控制台访问地址:http://localhost:9999…...
波导阵列天线 学习笔记11双极化全金属垂直公共馈电平板波导槽阵列天线
摘要: 本communicaition提出了一种双极化全金属垂直公共馈电平板波导槽阵列天线。最初提出了一种公共馈电的单层槽平板波导来实现双极化阵列。此设计消除了传统背腔公共馈电的复杂腔体边缘的必要性,提供了一种更简单的天线结构。在2x2子阵列种发展了宽十…...