【操作系统(Linux)】——通过案例学习父子进程的线程异步性
本篇旨在通过几个案例来学习父子进程的线程异步性
一、父进程与子进程
我们将要做的: 创建父子进程,观察父子进程执行的顺序,了解进程执行的异步行为
源代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h> // 定义了 POSIX 操作系统 API(Unix/Linux 下的系统调用函数)
#include <stdlib.h>int main()
{pid_t pid; // 进程idchar*msg; // 信息缓冲区int k; // 变量,后面用于控制执行打印的次数printf("观察父子进程执行的先后顺序,了解调度算法的特征\n");pid=fork(); // 创建子进程switch(pid){case 0:msg="子进程在运行";k=3;break;case -1:msg="进程创建失败";break; default:msg="父进程在运行";k=5;break;}while(k>0){puts(msg); sleep(1); k--; }exit(0);
}
🔧1. 头文件讲解
#include <sys/types.h>
- 作用:定义数据类型,如
pid_t
。 pid_t
是一个整型,用于表示进程 ID,确保跨平台一致性。- 一般与
fork()
、wait()
等系统调用一起使用。
#include <unistd.h>
- 作用:定义了 POSIX 操作系统 API(Unix/Linux 下的系统调用函数)。
- 提供本程序中用到的:
fork()
:创建子进程sleep()
:让进程休眠若干秒- 还包括
getpid()
(获取进程ID)、exec
族函数(程序替换)等。
#include <stdlib.h>
- 作用:标准库函数,如内存分配、程序控制等。
- 本程序中使用了:
exit(0)
:正常退出当前进程(0 表示正常退出)
🧠 2. 核心函数讲解
fork()
- 函数原型:
pid_t fork(void);
- 作用:创建一个新的子进程,该子进程是调用它的进程的副本。
- 返回值:
- 在父进程中,
fork()
返回子进程的 PID(大于 0) - 在子进程中,
fork()
返回 0 - 创建失败返回 -1
- 在父进程中,
switch(pid)
- 根据
fork()
的返回值来判断当前是:- 子进程(
pid == 0
) - 父进程(
pid > 0
) - 创建失败(
pid == -1
)
- 子进程(
puts(msg)
- 输出字符串
msg
并自动换行,功能类似于printf("%s\\n", msg);
,但更简单。
sleep(1)
- 暂停当前线程执行 1 秒钟,模拟处理过程,也便于观察进程输出顺序。
exit(0)
- 正常终止当前进程。系统看到返回值 0,认为程序成功执行。
📌 3. 程序运行逻辑总结
- 调用
fork()
创建子进程,得到两个并发执行的进程。 - 每个进程根据
fork()
的返回值设定自己的输出内容(msg
)和输出次数(k
)。 - 每个进程都进入
while(k>0)
循环,每秒输出一次msg
,共输出k
次。 - 最终执行
exit(0)
正常退出。
🧪 4. 运行效果说明
实际运行时,输出类似:
观察父子进程执行的先后顺序,了解调度算法的特征
父进程在运行
子进程在运行
子进程在运行
父进程在运行
...
由于父子进程是并发执行的,它们输出的先后顺序会随着调度器算法、系统负载等因素而变化。
二、主进程与子进程
我们将做的: 创建主线程和子线程,观察多线程执行的顺序,了解线程执行的异步行为
源代码:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h> // POSIX 线程库函数static int run=1; // 子线程循环判断条件,主线程设置为 0 后子线程结束
static int retvalue; // 子线程退出时返回的值,供主线程获取void *threadfunc(void*arg)
{int*running=arg; // 接受主线程传入的参数printf("子线程初始化完毕,传入参数为:%d\n",*running); while(*running) //子线程通过 *running 控制循环是否继续{printf("子线程正在运行\n");usleep(1); // 微秒级休眠}printf("子线程退出\n");retvalue=8;pthread_exit((void*)&retvalue); // 返回 retvalue 的地址给主线程
}
int main()
{pthread_t tid; // 线程idint ret=-1;int times=3;int i=0;int *ret_join=NULL;// 创建一个线程,线程函数为threadfunc,传入参数为&runret=pthread_create(&tid,NULL,(void*)threadfunc,&run); if(ret!=0){printf("建立线程失败\n");return 1;}printf("主线程创建子线程后在运行...\n");usleep(1); // 主线程短暂休眠,为了让子线程有机会先运行printf("主线程调用usleep(1)...\n");for(;i<times;i++){printf("主线程打印i=%d\n",i);usleep(1);}run=0; // 子进程控制参数设置为0,通知子进程结束pthread_join(tid,(void*)&ret_join); printf("线程返回值为:%d\n",*ret_join);return 0;
}
这段代码是一个使用 pthread
实现多线程的基础示例,展示了如何创建线程、线程间共享数据、线程退出返回值,以及主线程如何等待子线程完成。下面详细逐行讲解:
✅ 1. 头文件讲解
#include <pthread.h> // POSIX 线程库函数
pthread.h
是 POSIX 标准线程库头文件,提供线程创建、同步、退出等函数定义。
🧠 2. 全局变量定义
static int run = 1; // 子线程循环判断条件,主线程设置为 0 后子线程结束
static int retvalue; // 子线程退出时返回的值,供主线程获取
run
是主线程与子线程共享的控制变量。retvalue
将作为子线程pthread_exit
返回值的地址,供主线程获取。
🚀 3. 线程函数 threadfunc
void *threadfunc(void* arg)
{int* running = arg;printf("子线程初始化完毕,传入参数为:%d\n", *running); while (*running){printf("子线程正在运行\n");usleep(1); // 微秒级休眠(1 微秒 = 0.001 毫秒)}printf("子线程退出\n");retvalue = 8;pthread_exit((void*)&retvalue); // 返回 retvalue 的地址给主线程
}
✅ 关键点说明:
void *threadfunc(void* arg)
是 pthread 要求的线程函数格式。arg
是传入的参数,实际是主线程传入&run
。- 子线程通过
*running
控制循环是否继续。 - 使用
pthread_exit()
显式结束线程,并返回结果指针。
🧵 4. 主线程 main
pthread_t tid; // 声明线程 id
int ret = -1; // 初始化返回值
int times = 3; // 打印次数
int i = 0;
int *ret_join = NULL;
ret = pthread_create(&tid, NULL, (void*)threadfunc, &run);
- 创建一个线程,线程函数为
threadfunc
,传入参数为&run
。 ret
为返回值,0 表示成功。
if(ret != 0)
{printf("建立线程失败\n");return 1;
}
printf("主线程创建子线程后在运行...\n");
usleep(1);
printf("主线程调用usleep(1)...\n");
- 主线程短暂停顿,为了让子线程有机会先运行。
for(; i < times; i++)
{printf("主线程打印i=%d\n", i);usleep(1);
}
- 主线程执行 3 次循环,每次 sleep 1 微秒,并打印当前
i
。
run = 0;
- 将共享变量
run
设置为 0,通知子线程退出。
pthread_join(tid, (void*)&ret_join);
- 等待子线程结束,并获取返回值。
- 注意这里
ret_join
是int *
类型,用于接收retvalue
的地址。
printf("线程返回值为:%d\n", *ret_join);
- 打印子线程返回的值
8
。
🧪 5. 运行输出示例(大致)
主线程创建子线程后在运行...
主线程调用usleep(1)...
子线程初始化完毕,传入参数为:1
子线程正在运行
主线程打印i=0
子线程正在运行
主线程打印i=1
子线程正在运行
主线程打印i=2
子线程正在运行
子线程退出
线程返回值为:8
(线程调度不确定,输出顺序可能变化)
📌 6. 知识点总结
项目 | 内容说明 |
---|---|
pthread_create | 创建新线程 |
pthread_join | 等待线程结束,获取返回值 |
pthread_exit | 子线程退出并返回值 |
usleep(x) | 微秒级休眠,适合线程示例中短暂等待 |
共享变量通信 | 主线程修改 run ,控制子线程退出 |
⚠️ 7. 建议与优化
usleep(1)
睡眠时间太短(1 微秒),可以改为usleep(100000)
(即 0.1 秒)方便观察输出。- 变量
retvalue
设置为static
是为了确保其生命周期足够长,返回地址有效。 - 多线程程序应考虑线程安全问题,如资源竞争、内存可见性等,在多核机器中尤为重要。
三、多线程对共享变量的非互斥访问
我们将要做的: 构造「多线程共享变量竞争」的现象,并分析现象发生的原因,进而思考解决方式。
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>int num=30,count=10;void *sub1(void *arg) {int i = 0,tmp;for (; i <count; i++){tmp=num-1;usleep(13);num=tmp;printf("线程1 num减1后值为: %d\n",num);}return ((void *)0);
}
void *sub2(void *arg){int i=0,tmp;for(;i<count;i++){tmp=num-1;usleep(31);num=tmp;printf("线程2 num减1后值为: %d\n",num);}return ((void *)0);
}
int main(int argc, char** argv) {pthread_t tid1,tid2; // 两个子线程的idint err,i=0,tmp;void *tret; // 线程返回值err=pthread_create(&tid1,NULL,sub1,NULL);if(err!=0){printf("pthread_create error:%s\n",strerror(err));exit(-1);}err=pthread_create(&tid2,NULL,sub2,NULL);if(err!=0){printf("pthread_create error:%s\n",strerror(err));exit(-1);}for(;i<count;i++){tmp=num-1;usleep(5);num=tmp;printf("main num减1后值为: %d\n",num);}printf("两个线程运行结束\n");err=pthread_join(tid1,&tret);if(err!=0){printf("can not join with thread1:%s\n",strerror(err));exit(-1);}printf("thread 1 exit code %d\n",(int)tret);err=pthread_join(tid2,&tret);if(err!=0){printf("can not join with thread1:%s\n",strerror(err));exit(-1);}printf("thread 2 exit code %d\n",(int)tret);return 0;
}
🧠 1. 程序功能概述
创建了两个线程 sub1
和 sub2
,以及主线程三者共同对一个全局变量 num
执行减 1 操作,共减去 count * 3 = 30
次。
初始值:
int num = 30, count = 10;
所以理论上最终 num == 0
,但实际上并不一定!
⚠️ 2. 存在的核心问题:数据竞争(Race Condition)
❗ 对 num--
是分三步执行的:
tmp = num - 1;
usleep(x);
num = tmp;
这个过程不是原子操作,多个线程可能“交叉”访问这个变量,造成竞态条件(Race Condition)。
中间插入
usleep()
只是为了放大并发写入带来的冲突概率,模拟真实环境下的并发问题。
举例说明:
假设此时 num = 10
,两个线程同时读到:
线程1:tmp1 = 10 - 1 = 9,睡眠
线程2:tmp2 = 10 - 1 = 9,睡眠
然后:
线程1醒来执行 num = 9
线程2醒来执行 num = 9 (覆盖了线程1的操作)
🔴 这样 num 实际只减少了一次,而我们期望它减少两次(一个线程分别减少一次)!
🔍 3. 运行效果举例(输出可能类似):
线程1 num减1后值为: 29
线程2 num减1后值为: 28
main num减1后值为: 27
线程1 num减1后值为: 27 ←❗ 重复了
main num减1后值为: 26
线程2 num减1后值为: 26 ←❗ 再次重复
最终 num
的值可能 不是 0,甚至是更高。原因就是上面说的:很多次减法操作失效了。
✅4. 如何解决?使用线程同步机制:互斥锁 pthread_mutex_t
例如,添加全局互斥锁:
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
将每个对 num
的访问部分用锁保护:
pthread_mutex_lock(&lock);
tmp = num - 1;
usleep(13); // 保留你原来的模拟处理
num = tmp;
pthread_mutex_unlock(&lock);
🔒 这样确保每次只有一个线程在访问和修改 num
。
🛠️ 5. 修改后关键片段示例(以 sub1
为例)
void *sub1(void *arg) {int i = 0, tmp;for (; i < count; i++) {pthread_mutex_lock(&lock);tmp = num - 1;usleep(13);num = tmp;printf("线程1 num减1后值为: %d\n", num);pthread_mutex_unlock(&lock);}return ((void *)0);
}
主线程、sub2
中也要加锁。
🔚 6. 总结
问题 | 说明 |
---|---|
数据竞争 | 多线程访问全局变量未加锁 |
后果 | num 最终值不确定,减法丢失 |
解决 | 使用 pthread_mutex 互斥锁 |
调试 | 建议加 -fsanitize=thread 或使用 valgrind --tool=helgrind 检查 |
相关文章:
【操作系统(Linux)】——通过案例学习父子进程的线程异步性
本篇旨在通过几个案例来学习父子进程的线程异步性 一、父进程与子进程 我们将要做的: 创建父子进程,观察父子进程执行的顺序,了解进程执行的异步行为 源代码: #include <stdio.h> #include <sys/types.h> #include…...
汽车CAN总线采样点和采样率详解
写在前面 本篇文章主要讲解在汽车电子中CAN总线采样率的相关知识点,内容涉及CAN波特率、采样点、时间份额、同步跳转宽度以及采样率的计算。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1、CAN波特率 CAN波特率常规分为250kbps和500kbps,本文章主要以这两个波特率为…...
一款基于 .NET 8 + Vue 开源的、企业级中后台权限管理系统
前言 今天大姚给大家分享一款基于 .NET 8 Vue 开源、前后端分离的企业级中后台权限管理系统,助力快速完成常规业务需求开发:ApeVolo.Admin。 项目介绍 ApeVolo.Admin 一款基于.NET 8、SqlSugar、Vue、Elment UI、RBAC、前后端分离、开源(…...
创建两个进程
文章目录 创建两个进程**2. 实现思路及源代码**2.1 实现思路2.1.1 fork() 函数2.1.2 思路分析 2.2 源代码2.2.1 源代码分析2.2.2 源代码测试结果 **3. 打印进程树**3.1 tmux操作步骤3.1.1 启动 tmux3.1.2 分屏操作(Ctrlb是在告诉系统准备输入一个快捷键)…...
Zephyr、FreeRTOS、RT-Thread 定时器区别分析
一、核心特性对比 特性ZephyrFreeRTOSRT-Thread定时器类型系统定时器(k_timer)、硬件定时器软件定时器(基于系统tick)软件定时器、硬件定时器定时模式单次、周期性单次、自动重载(周期性)单次、周期、自定…...
.NET 中的深拷贝实现方法
在 .NET 中实现深拷贝(Deep Copy)有几种常用方法,深拷贝是指创建一个新对象,并递归地复制原对象及其所有引用对象,而不仅仅是复制引用。 目录 1. 使用序列化/反序列化2. 使用 JSON 序列化(Newtonsoft.Json…...
Vue/React组件/指令/Hooks封装的基本原则以及示例
一、组件封装原则与示例 Vue组件封装 核心原则 • 单一职责:每个组件只解决一个功能(如分页、过滤表单) • Props控制输入:通过定义明确的Props接口接收外部数据(类型校验、默认值) • Emit事件通信:子组件通过$emit向父组件传递动作(如分页切换) • 插槽扩展性:使用…...
医学分割新标杆!双路径PGM-UNet:CNN+Mamba实现病灶毫厘级捕捉
一、引言:医学图像分割的挑战与机遇 医学图像分割是辅助疾病诊断和治疗规划的关键技术,但传统方法常受限于复杂病理特征和微小结构。现有深度学习模型(如CNN和Transformer)虽各有优势,但CNN难以建模长距离依赖&…...
软考-高项,知识点一览十六 采购管理
十六 采购管理 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。被授权采购项目所需货物、服务的人员可以是项目团队、管理层或组织采购部的成员 。 管理基础 协议/采购合同 协议可以是合同、服务水平协议 (SLA) 、谅解备忘录、协议备…...
Spring MVC 视图解析器(JSP、Thymeleaf、Freemarker、 JSON/HTML、Bean)详解
Spring MVC 视图解析器详解 1. 视图解析器概述 视图解析器(ViewResolver)是 Spring MVC 的核心组件,负责将控制器返回的视图名称(如 success)转换为具体的 View 对象(如 Thymeleaf 模板或 JSP 文件&#x…...
Joomla 常用模块 - 在线用户与Joomla 常用模块 - 自定义HTML模块
Joomla 常用模块 - 在线用户 在这一节中,我们将介绍如何建立在线用户模块。在线用户模块是显示当前访问网站的匿名用户(如访客)和注册用户(登录用户)的数量。 建立在线用户模块你可以参考以下步骤: 1、选…...
缓存工具类
这里写目录标题 背景代码使用 背景 写oj系统过程中,需要使用缓存工具类。其功能为,先从缓存中获取数据,如数据不存在,从数据库中获取。 代码 package xyz.wry.utils;import org.springframework.util.ObjectUtils;import java.…...
【C++】list底层封装和实现
目录 节点类基本框架构造函数 list类构造函数拷贝构造函数赋值重载析构函数 迭代器类前言(string和vector的区别)迭代器模版参数的说明构造函数运算符重载- -运算符的重载运算符重载!运算符的重载*运算符的重载->运算符的重载 迭代器相关函数插入和删除函数inserterase函数p…...
一种替代DOORS在WORD中进行需求管理的方法 (二)
一、前景 参考: 一种替代DOORS在WORD中进行需求管理的方法(基于WORD插件的应用)_doors aspice-CSDN博客 二、界面和资源 WORD2013/WORD2016 插件 【已使用该工具通过第三方功能安全产品认证】: 1、 核心功能 1、需求编号和跟…...
学习海康VisionMaster之多直线查找
一:进一步学习了 今天学习下VisionMaster中的多直线查找,这个还是拟合直线的衍生应用,可以在测量框内同时查找多段时间 二:开始学习 1:什么是多直线查找? 一个检测框,就可以在检测框里面同时检…...
MATLAB的24脉波整流器Simulink仿真与故障诊断
本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 目录 0 引言 1 故障数据采集 2 故障特征提取 3 故障诊断分类 4 结语 本博客内容是在MATLAB2023下完成。 0 引言 对于电力电子电路的故障诊断…...
顺序表专题(C语言)
文章目录 前言一、数据结构相关概念类比说明:书架与数据结构 二、线性表基本概念两种实现方式对比 三、顺序表的概念及结构1. 顺序表的定义2. 静态顺序表的基本结构关键点解析: 3. 结构体成员解释 四、顺序表分类五、动态顺序表的实现总结 前言 在C语言…...
Python Cookbook-5.9 在排序完毕的序列中寻找元素
任务 你需要寻找序列中的一系列元素。 解决方案 解决方案如果列表L已经是排序完毕的状态,则Python 标准库提供的 bisect 模块可以很容易地检查出元素x是否在L中: import bisect x_insert_point bisect.bisect_right(L,x) x_is_present L[x_insert_point-1:x_i…...
Johnson算法 流水线问题 java实现
某印刷厂有 6项加工任务J1,J2,J3,J4,J5,J6,需要在两台机器Mi和M2上完 成。 在机器Mi上各任务所需时间为5,1,8,5,3,4单位; 在机器M2上各任务所需时间为7,2,2,4,7,4单位。 即时间矩阵为: T1 {5, …...
10:00开始面试,10:08就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
[Vue]App.vue讲解
页面中可以看见的内容不再在index.html中进行编辑,而是在App.vue中进行编辑。 组件化开发 在传统的html开发中,一个页面的资源往往都写在同一个html文件中。这种模式在开发小规模、样式简单的项目时会相当便捷,但当项目规模越来越大…...
python中的*args和**args
在 Python 里,*args 和 **kwargs 是两个特殊的语法,它们能让函数接收不定数量的参数。下面分别对它们进行介绍。 *args *args 用于向函数传递不定数量的非关键字参数,这些参数会被封装成一个元组。以下是示例代码: def sum_num…...
解决Spring Boot上传默认限制文件大小和完善超限异常(若依框架)
文章目录 报错信息问题分析技术原理解决方法1️⃣调整 Spring Boot 配置文件2️⃣检查内嵌 Tomcat 配置(可选)3️⃣ 代码自定义配置(覆盖配置文件) 全局异常处理代码 报错信息 org.springframework.web.multipart.MaxUploadSizeE…...
Pyside6使用QtWebEngine实现GUI嵌入网页内容
Pyside6是由Qt官方维护和开发的一个用于创建跨平台桌面应用程序的Python绑定库。QtWebEngine是Qt提供的一个模块,它基于Chromium项目,允许开发者在他们的应用程序中嵌入网页内容。通过结合Pyside6和QtWebEngine,开发者可以轻松地创建具有现代…...
【每日一个知识点】多项式回归(Polynomial Regression)
多项式回归(Polynomial Regression)是一种对非线性关系建模的回归方法,它是在线性回归的基础上,引入特征的高次项,从而捕捉自变量与因变量之间的非线性关系。 🔹一、基本概念 多项式回归的形式:…...
最新版PhpStorm超详细图文安装教程,带补丁包(2025最新版保姆级教程)
目录 前言 一、PhpStorm最新版下载 二、PhpStorm安装 三、PhpStorm补丁 四、运行PhpStorm 前言 PhpStorm 是 JetBrains 公司推出的 专业 PHP 集成开发环境(IDE),专为提升 PHP 开发效率设计。其核心功能包括智能代码补全、实时语法错误检…...
C++:模拟实现string
目录 一:string类 二:构造函数、拷贝构造函数及析构函数 1、构造函数 2、拷贝构造函数 3、析构函数 三、实现string中对容量操作的成员函数 1、size 2、capacity 3、reserve 4、resize 5、clear 6、empty 四、string类中对象的增删查改操作 …...
Python 小练习系列 | Vol.14:掌握偏函数 partial,用函数更丝滑!
🧩 Python 小练习系列 | Vol.14:掌握偏函数 partial,用函数更丝滑! 本节的 Python 小练习系列我们将聚焦一个 冷门但高能 的工具 —— functools.partial。它的作用类似于“函数的预设模板”,能帮你写出更加灵活、优雅…...
处理Excel的python库openpyxl、xlrd、xlwt、pandas有什么区别,搞懂它
openpyxl、xlrd、xlwt、pandas 都能处理 Excel 表格,但用途和适合的场景不同。今天做个总结: 库名功能支持格式读写支持样式备注openpyxl全面的.xlsx处理库.xlsx(Excel2007)✅✅✅首选xlrd读取.xls文件的老牌工具.xls(…...
【OSG学习笔记】Day 1: OSG初探——环境搭建与第一个3D窗口
什么是 OSG? 全称:OpenSceneGraph(开源场景图) 定位:一个基于 C/OpenGL 的高性能开源3D图形开发工具包,专注于实时渲染和复杂场景管理。 核心思想:通过 场景图(Scene Graph…...
linux--------------进程控制(下)
一、进程等待 1.1 进程等待必要性 子进程退出后,若父进程不管不顾,可能会产生 “僵尸进程”,进而造成内存泄漏。进程一旦变为僵尸状态,即使使用 kill -9 也无法将其杀死,因为无法杀死一个已死的进程。父进程需要了解…...
【Axure元件分享】移动端滑动拨盘日期选择器
在移动端产品设计中,日期选择器是用户交互中常见的组件,尤其在预订、日程管理等场景中扮演着关键角色。本文将介绍一款基于Axure的移动端滑动拨盘日期选择器元件,该元件通过模拟拨盘滑动交互效果,为用户提供直观日期选择体验。 下…...
基于 JavaWeb 的 SpringBoot 在线课程会员系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
Linux入门
复习:https://blog.csdn.net/ 操作系统概述 硬件和软件 计算机由硬件和软件组成 硬件:计算机系统中由电子,机械和光电元件等组成的各种物理装置的总称 软件:用户和计算机硬件之间的接口和桥梁,用户通过软件与计算机进行交流 而操作系统就是软件的一类. 操作系统 主要负…...
金融壹账通推出大模型一体机,加速金融行业AI落地与应用
在当前数字化和人工智能技术迅猛发展的背景下,金融行业正面临着效率提升、风险管控和客户体验优化的多重挑战。为应对这些需求,金融壹账通近期推出了全新的“大模型一体机”解决方案。该方案集算力、模型、工具链和应用场景于一体,不仅具备小投入、低门槛和私有化部署的优势,还…...
迁移WordPress网站(大文件版本)
安装插件All-in-One WP Migration,备份并下载文件,可以参考我的另外一篇文章wordpress 利用 All-in-One WP Migration全站转移使用工具解压缩.wpress文件 工具名称:wpress-extractor,github下载地址 或者 我已经上传,也…...
Linux普通用户怎么切换为root用户
在 Linux 中,普通用户切换到 root 用户的常用命令有以下几种: 切到root用户 sudo -i(当前用户的密码) su -(需要知道root 密码) 1. su 命令(需要知道 root 密码) su - 或 su - roo…...
WinForm真入门(11)——ComboBox控件详解
WinForm中 ComboBox 控件详解 ComboBox 是 WinForms 中一个集文本框与下拉列表于一体的控件,支持用户从预定义选项中选择或直接输入内容。以下从核心属性、事件、使用场景到高级技巧的全面解析: 一、ComboBox 核心属性 属性说明示例Items下拉…...
Spring 服务调用接口时,提示You should be redirected automatically to target URL:
问题 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><title>Redirecting...</title><h1>Redirecting...</h1><p>You should be redirected automatically to target URL: <a href"http://xxx/api/v1/branch…...
OpenCV--模板匹配
一、引言 在计算机视觉领域,模板匹配是一种用于在图像中查找特定目标的基本技术。OpenCV 作为广泛使用的计算机视觉库,提供了强大且易于使用的模板匹配功能。无论是在工业检测、图像识别还是机器人视觉等领域,模板匹配都发挥着重要作用。本文…...
【Ragflow】14.MinerU解析脚本,接入ragflow知识库
概述 前文写了下 MinerU 的解析效果,收到不少读者催更,想利用 MinerU 替换 Deepdoc 的原始的解析器。 我认为,开发新功能基本可遵循能用-好用-用好这三个阶段: 能用:先通过脚本实现该功能,主打的是能用就行 好用&am…...
【SpringCloud】从入门到精通(上)
今天主播我把黑马新版微服务课程MQ高级之前的内容都看完了,虽然在看视频的时候也记了笔记,但是看完之后还是忘得差不多了,所以打算写一篇博客再温习一下内容。 课程坐标:黑马程序员SpringCloud微服务开发与实战 微服务 认识单体架构 单体架…...
第一章:SQL 基础语法与数据查询
1. 什么是 SQL? SQL(Structured Query Language) 是用于管理和操作关系型数据库的标准语言。核心功能: 数据查询(SELECT)数据定义(CREATE、ALTER、DROP࿰…...
Openlayers:海量图形渲染之WebGL渲染
最近由于在工作中涉及到了海量图形渲染的问题,因此我开始研究相关的解决方案。我在网络上寻找相关的解决方案时发现许多的文章都提到利用Openlayers中的WebGLPointsLayer类,可以实现渲染海量的点,之后我又了解到利用WebGLVectorLayer类可以渲…...
任务调度和安全如何结合
联邦学习与隐私保护 分布式模型训练:各边缘节点本地训练调度模型,仅共享模型参数而非原始数据,避免隐私泄露(参考[11]的联邦学习框架)。差分隐私:在奖励计算或状态反馈中加入噪声,防止通过调度…...
ARP攻击 DAI动态ARP检测学习笔记(超详细)
一、概述 ARP(Address Resolution Protocol,地址解析协议)是将IP地址解析为以太网MAC地址(或称为物理地址)的协议,指导三层报文的转发。ARP有简单、易用的优点,但是也因为其没有任何安全认证机制而容易被攻击者利用。属于是又爱又恨的一种协议了。目前ARP攻击和ARP病毒已经成为…...
Springboot--Kafka客户端参数关键参数的调整方法
调整 Kafka 客户端参数需结合生产者、消费者和 Broker 的配置,以实现性能优化、可靠性保障或资源限制。以下是关键参数的调整方法和注意事项: 一、生产者参数调整 max.request.size 作用:限制单个请求的最大字节数(包括消…...
NO.79十六届蓝桥杯备战|数据结构-扩展域并查集-带权并查集|团伙|食物链|银河英雄传说(C++)
扩展域并查集 普通的并查集只能解决各元素之间仅存在⼀种相互关系,⽐如《亲戚》题⽬中: a 和b 是亲戚关系,b 和c 是亲戚关系,这时就可以查找出a 和c 也存在亲戚关系。 但如果存在各元素之间存在多种相互关系,普通并查…...
蓝桥杯2022年第十三届省赛真题-统计子矩阵
题目链接: 代码思路: ①枚举上、下边界。 ②求每一列前缀和。 ②固定上下边界后,在通过双指针确定子矩阵的左右边界。双指针维护一个窗口 [l, r],确保窗口中所有列的和(下面前缀和-上面前缀和)不超过 K。通过滑动窗口方式&…...
openEuler24.03 LTS下安装Spark
目录 安装模式介绍 下载Spark 安装Local模式 前提条件 解压安装包 简单使用 安装Standalone模式 前提条件 集群规划 解压安装包 配置Spark 配置Spark-env.sh 配置workers 分发到其他机器 启动集群 简单使用 关闭集群 安装YARN模式 前提条件 解压安装包 配…...