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

多线程

线程是什么?

1、线程是进程的执行分支,一个进程内部的控制程序

2、一个进程至少有一个执行线程

3、从CPU角度来看,线程就是一个更轻量化的线程

4、线程在进程内部运行,所以本质就是在进程地址空间上运行

注意:

一个程序至少有一个进程,一个进程至少有一个线程?

程序是静态的,进程是程序一次运行

线程异常

当一个进程中的某个线程出现除0或者野指针错误时,线程异常退出,会导致进程一起退出

线程是进程的执行分支,所以当线程出现异常,进程也会出现类似异常

进程VS线程

1、线程拥有系统资源吗?

进程是资源分配的基本单位,所以线程不拥有系统资源

进程是资源分配的基本单位,线程是调度的基本单位

2、线程和进程都可以并发执行

进程比线程安全的原因是:同一进程下的线程共享同一片资源,虽然每个线程看起来只能访问自己那部分资源,但其实线程之间资源是共享的,进程之间不会数据共享

线程函数

创建线程

参数:

thread:返回线程ID

attr:设置线程的属性,attr为NULL表示使用默认属性

start_routine:是一个函数地址,线程启动后要执行的函数

arg:传给线程启动函数的参数

返回值:成功返回0;失败返回错误码

第一个返回的线程ID和之前进程调度标识线程的ID不是一个东西

1、这里的第一个参数指向虚拟内存,内存单元的地址就是这个线程ID(tid)

        所以这里pthread_t类型,本质就是进程地址空间上的一个地址

2、进程调度中的线程ID的意思是,线程是操作系统调度器的最小单位,所以需要一个数值来标识唯一的线程

获取线程ID

pthread_self函数

获取用户级线程的tid,不是轻量级进程的ID,用户级线程是由用户级空间实现的线程,而轻量级进程是由操作系统管理,一个线程可能映射一个或多个轻量级进程

线程终止

1、return返回,在main函数中return 就相当于pthread_exit

2、pthread_exit终止自己

这里参数不能指向局部变量,如果需要可以使用pthread_join()来接收

pthread_exit或者return返回的指针所指向的内存单元必须是全局或者malloc申请的,不能在线程函数的栈上分配,因为如果其他线程访问这个指针时,线程函数已经退出了,找不到指针

3、pthread_cancel

终止同一进程中的线程

返回值:成功返回0,失败返回非0

注意:

在有多个线程的情况下,主线程调用pthread_cancel(pthread_self()), 则主线程状态为Z, 其他线程正常运行

在有多个线程的情况下,主线程从main函数的return返回或者调用pthread_exit函数,则整个进程退出

线程等待

为什么需要线程等待?

退出的线程,不会释放进程地址空间中的内容

创建新线程不会复用之前退出线程的地址空间

退出方式不同,第二个参数获取的状态也会不同

1、return返回,获取线程函数的返回值

2、被别的线程pthread_cancel()之后,存放常数PTHREAD_CANCELED

3、pthread_exit()自己终止之后,获取传给pthread_exit的参数

4、不关心退出状态,设置为NULL

线程分离

默认情况下,新创建的线程都是joinable,使用pthread_join()来释放资源

但是如果对退出状态不关心时,pthread_join()就会成为负担,所以当线程退出时,自动释放资源

注意:线程分离和等待是冲突的,所以不能两个都使用

互斥

相关概念

临界资源:多线程执行流共享的资源

临界区:每个线程内部访问临界资源的代码

互斥:保证只有一个执行流进入临界区访问临时资源,对临时资源起保护作用

原子性:要么完成,要么没完成,没有正在做的概念

互斥量mutex

当一个线程访问共享数据时,可能其他线程也要访问共享数据,这个时候共享数据可能就会出现二义性

这就需要引入锁,也就是互斥量来解决上述问题

1、保证当一个线程访问共享资源,其他线程不能访问共享资源(加锁)

2、如果多个线程都要访问共享资源时,只允许一个线程访问

3、当一个线程没有访问共享资源时,不能阻止其他线程访问(解锁)

mutex简单理解成一个0\1计数器

0,表示已经有执行流加锁成功,资源不可访问

1,没有加锁,资源可以访问

初始化互斥量

1、静态初始化

pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;

2、动态初始化

pthread_mutex_t mtx;
pthread_mutex_init(&mtx, NULL);

销毁互斥量

int pthread_mutex_destroy(pthread_mutex_t *mutex);

静态创建的互斥量不需要销毁

动态创建的互斥连更需要使用销毁函数来销毁

加锁和解锁

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

 当一个线程加锁时,如果其他线程已经申请锁了,那么该线程加锁就会和其他线程竞争锁,陷入阻塞,等待解锁

可重入函数和线程安全

线程安全:多个线程并发同一片代码不会出现不同的结果,对静态或者全局变量进行操作,并且没有锁时,就可能会造成线程安全

可重入函数:当一个函数被不同的执行流调用,当一个函数流程还没有走完,其他线程进入,这称为重入,当一个函数再重入的情况下,结果不会出现任何不同或者任何问题,这就称为可重入函数

注意:

可重入函数是线程安全的,但是线程安全不一定是可重入函数

当对临时资源进行加锁,那么这个临时资源就是线程安全的,但是如果重入函数在加锁时,再次调用就可能会造成死锁,变成线程不安全的

死锁

死锁是指一组线程中各个线程占有不会释放的资源,但是因为互相申请别人占用的资源而处于永久等待状态

死锁的四个必要条件

1、互斥条件:一个资源只能被一个执行流使用

2、请求和保持条件:一个执行流申请资源而阻塞时,但是不释放自己的资源

3、不剥夺条件:当一个执行流获得资源,未使用完之前,不能强行剥夺

4、循环等待条件:若干执行流形成的一种头尾相连的循环等待资源关系

避免死锁

1、破环四个必要条件

2、加锁顺序一致(也就是破环循环等待条件,每个线程按照相同顺序加锁,可以避免循环等待)

3、避免锁未释放

4、资源一次性分配(避免加锁之后,再次申请资源,减少加锁场景)

Linux线程同步

条件变量:Linux同步机制,允许线程在条件不满足时进入等待状态,直到条件满足时,使线程可以进入睡眠状态,从而避免不必要占用CPU资源

同步:在保证数据安全的前提下,线程按照某种特定顺序访问临界资源,从而避免饥饿问题

竞态条件:由于操作执行顺序不当,造成的程序异常

饥饿问题:由于竞争条件不平等,导致一些线程访问共享资源被调度器忽略,从而无法访问共享资源

多线程的同步机制

1、信号量

信号量只支持两种操作,等待和信号,因为在Linux中这两个有特殊含义,所以更常用的是PV操作

信号量只有0,1

当申请信号量进行P操作,信号量-1,如果为0,在进行P操作,线程被挂起

当信号量释放时进行V操作,信号量+1

2、互斥锁

3、条件变量

既然有了互斥锁保护共享资源,那么为什么还需要信号量?信号量和互斥锁区别是什么

信号量和互斥锁最本质的区别就是互斥锁会进行锁竞争,当申请锁时,如果会进行竞争。但是如果申请信号量,当信号量被占用时,线程会被挂起,下次再调用时,该线程直接获得信号量资源

所以互斥锁可能永远也申请不到,信号量会在线程被挂起后,下次直接获取

条件变量函数

初始化和销毁

pthread_cond_init()参数arr为NULL,标识使用默认属性

条件等待

pthread_cond_timedwait()多出来的参数就是等待条件变量超时时间,如果超时就会返回错误码

这里为什么等待要在加锁和解锁之间?

1、一个线程加锁之后进入等待,其他线程如何访问临界资源?

pthread_cond_wait()会自动解锁

2、如何知道线程是否需要休眠?

临界资源不就绪,临界资源也是有状态的

3、如何知道临界资源是否就绪?

通过判断,判断也是访问临界资源,所以等待必须在加锁之后

唤醒等待

pthread_cond_signal()唤醒指定线程

 pthread_cond_broadcast()唤醒所有线程

伪唤醒

在没有明确条件触发的情况下被条件变量唤醒,这种情况就可能导致在唤醒时,条件不满足,导致程序异常

解决办法:在pthread_cond_wait()处,使用while循环来充当判断条件,当伪唤醒时,能够再次进行判断,如果条件不满足就会再次进入等待

生产消费者模型

使用场景

321原则

3种关系:生产者和生产者(互斥),消费者和消费者(互斥),生产者和消费者(互斥和同步)

2个角色:生产者和消费者

一个交易场所:特定结构的内存空间

优点:

1、生产和消费者之间解耦合

2、支持忙先不均

3、支持并发

线程池

 线程过多会带来调度开销,降低内存局部性和整体性能,线程池维护这多个线程,防止在处理多个较短任务时,对线程的申请和销毁。

同时也能够解决大量不受控制的线程占用资源导致资源耗尽

单例模式

饿汉模式

在程序初始化时,加载所有资源, 无论资源是否用到都要加载

懒汉模式

在程序初始化时,只加载核心资源,其他资源在使用时才加载

所以懒汉模式下的,“延迟加载”能够优化服务器的启动速度

这两种模式下执行流/线程都是共享同一份资源的

线程安全下的懒汉模式

1、volatile关键字防止inst被编译器优化,对inst修改不要放到寄存器中,直接反映到内存,让所有线程看到

2、双if,降低锁冲突的概率 ,提高性能

3、互斥锁,保证只会new一个inst

typename <class T>
class Singleton
{
public:volatile static T* inst;std::mutex lock;T* Getinstance(){if(inst==NULL){lock.lock();if(inst==NULL)inst=new T();    lock.unlock();}return inst;}};

STL容器默认不是线程安全的

相关文章:

多线程

线程是什么&#xff1f; 1、线程是进程的执行分支&#xff0c;一个进程内部的控制程序 2、一个进程至少有一个执行线程 3、从CPU角度来看&#xff0c;线程就是一个更轻量化的线程 4、线程在进程内部运行&#xff0c;所以本质就是在进程地址空间上运行 注意&#xff1a; 一…...

Spring Boot林业产品推荐系统:用户指南

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此林业产品销售信…...

计算机网络 实验八 应用层相关协议分析

一、实验目的 熟悉CMailServer邮件服务软件和Outlook Express客户端软件的基本配置与使用&#xff1b;分析SMTP及POP3协议报文格式和SMTP及POP3协议的工作过程。 二、实验原理 为了观察到邮件发送的全部过程&#xff0c;需要在本地计算机上配置邮件服务器和客户代理。在这里我…...

实战ansible-playbook:Ansible Vault加密敏感数据(三)

在实际生产环境中,使用 Ansible Vault 来加密敏感数据是一种常见的做法。以下是一个详细的步骤和实际生产环境的使用案例,展示如何使用 Ansible Vault 来加密和管理敏感数据。 1. 安装 Ansible 确保你已经安装了 Ansible。如果还没有安装,可以使用以下命令进行安装: # 在…...

oracle 12c查看执行过的sql及当前正在执行的sql

V$SQL 提供了已经执行过及正在执行的SQL语句的信息。 一 查看共享池中所有sql的统计信息 #统计共享池中某类sql执行次数&#xff0c;总体执行时长&#xff0c;平均执行时长等信息&#xff0c;并按总体执行时长降序排序 SELECT INST_ID,SQL_ID,SQL_TEXT,SQL_FULLTEXT,EXECUTI…...

【大模型】Spring AI Alibaba 对接百炼平台大模型使用详解

目录 一、前言 二、Spring AI概述 2.1 spring ai是什么 2.2 Spring AI 核心能力 2.3 Spring AI 应用场景 三、Spring AI Alibaba 介绍 3.1 Spring AI Alibaba 是什么 3.2 Spring AI Alibaba 核心特点 3.3 Spring AI Alibaba 应用场景 四、SpringBoot 对接Spring AI Al…...

CSS:怎么把网站都变成灰色

当大家看到全站的内容都变成了灰色&#xff0c;包括按钮、图片等等。这时候我们可能会好奇这是怎么做到的呢&#xff1f; 有人会以为所有的内容都统一换了一个 CSS 样式&#xff0c;图片也全换成灰色的了&#xff0c;按钮等样式也统一换成了灰色样式。但你想想这个成本也太高了…...

Maven 常用命令

Maven 是一个强大的构建自动化工具&#xff0c;主要用于 Java 项目的管理和构建。 理解 Maven 命令对于高效管理与构建您的 Java 项目至关重要。 在本篇博客中&#xff0c;我们将探索每个 Java 开发者都应该掌握的一些最重要的 Maven 命令。 1. 设置 Maven 在深入探讨 Mave…...

【算法day1】数组:双指针算法

题目引用 这里以 1、LeetCode704.二分查找 2、LeetCode27.移除元素 3、LeetCode977.有序数组的平方 这三道题举例来说明数组中双指针的妙用。 1、二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜…...

CTF之密码学(DES)

一、基本原理 DES加密使用相同的密钥进行加密和解密操作。它使用一个56位的密钥&#xff08;另外8位为奇偶校验位&#xff0c;不直接参与加密过程&#xff0c;因此实际密钥长度为56位&#xff09;&#xff0c;对64位的数据块进行加密&#xff0c;得到64位的密文。加密过程主要…...

【css实现收货地址下边的平行四边形彩色线条】

废话不多说&#xff0c;直接上代码&#xff1a; <div class"address-block" ><!-- 其他内容... --><div class"checked-ar"></div> </div> .address-block{height:120px;position: relative;overflow: hidden;width: 500p…...

Linux—进程概念学习-03

目录 Linux—进程学习—31.进程优先级1.1Linux中的进程优先级1.2修改进程优先级—top 2.进程的其他概念3.进程切换4.环境变量4.0环境变量的理解4.1环境变量的基本概念4.2添加环境变量—export4.3Linux中环境变量的由来4.4常见环境变量4.5和环境变量相关的命令4.6通过系统调用获…...

设计模式之破环单例模式和阻止破坏

目录 1. 序列化和反序列化2. 反射 这里单例模式就不多说了 23种设计模式之单例模式 1. 序列化和反序列化 这里用饿汉式来做例子 LazySingleton import java.io.Serializable;public class LazySingleton implements Serializable {private static LazySingleton lazySinglet…...

c++(斗罗大陆)

这次&#xff0c;作者编了斗罗大陆的武魂、魂力等级&#xff0c;目前只写到了11级 #include<iostream> #include<conio.h> #include<windows.h> #include<stdlib.h> #include<stdio.h> #include<time.h> #include<strin…...

NodeJs使用Addon调用C++

本文介绍的是NodeJs使用node-addon-api调用C的方法 node-addon-api是一个C封装&#xff0c;基于N-API构建&#xff0c;目的是提供一个更高级和更易用的接口&#xff0c;但它仍然依赖N-API。 官方参考文档 开发环境 必须具备NodeJs环境 Window配置NodeJs环境&#xff08;绅士版…...

YOLOv11(Ultralytics)视频选定区域目标统计计数及跟踪

在计算机视觉的众多应用场景中&#xff0c;对特定区域的目标进行检测、跟踪与计数是一个常见且重要的需求。无论是在智慧交通中统计通过特定路口的车辆数量&#xff0c;还是在零售分析中追踪进入特定区域的顾客行为&#xff0c;这一功能都发挥着不可或缺的作用。 随着深度学习…...

【Nginx系列】Nginx配置优先级

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

搭建私有docker仓库

1. 安装docker依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl …...

C语言练级->##__VA_ARGS__(可变参数)的用法

有什么用&#xff1f; 通常__VA_ARGS__用于宏定义&#xff0c;其中关于日志宏需要用的&#xff0c;printf 等支持可变参数的函数的宏封装。 首先我们先知道这个__VA_ARGS__的英文全称是“Variadic Arguments” 叫可变参数。说到可变参数学过C语言的朋友们应该都会想到printf&…...

在 wordpress 中简易目录插件添加滑动条

实现思路 给目录容器添加一个 固定高度&#xff0c;并设置 CSS 的 overflow 属性 为 auto 或 scroll&#xff0c;使其内容可滚动。确保目录的滚动行为独立于页面的整体滚动。优化用户体验&#xff0c;添加平滑滚动效果。 操作步骤 1. 检查目录的 HTML 结构 首先&#xff0c;…...

Linux和Ubuntu的关系

Linux和Ubuntu的关系&#xff1a; 1. Linux本身是内核&#xff0c;Ubuntu系统是基于Linux内核的操作系统。 2. Linux内核操作系统的构成&#xff1a; 内核、shell、文件系统、应用程序 -应用程序&#xff1a;文本编辑器等 -文件系统&#xff1a;文件存放在存储设备上的组织方…...

【大数据学习 | Spark-Core】详解Spark的Shuffle阶段

1. shuffle前言 对spark任务划分阶段&#xff0c;遇到宽依赖会断开&#xff0c;所以在stage 与 stage 之间会产生shuffle&#xff0c;大多数Spark作业的性能主要就是消耗在了shuffle环节&#xff0c;因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。 负责shuffle…...

缓存方案分享

不知道大家平常更新缓存是怎么做的&#xff0c;但是大部分时候都是更新数据的同时更新缓存&#xff0c;今天和同事一起聊到一个缓存方案的问题&#xff0c;感觉很有趣、非常精妙&#xff0c;记录一下。 基于此本文将介绍几种常见的缓存更新策略&#xff0c;包括简单的缓存覆盖…...

从零开始配置Qt+VsCode环境

从零开始配置QtVsCode环境 文章目录 从零开始配置QtVsCode环境写在前面扩展安装及配置Qt Configure配置 VsCode创建Qt工程VsCodeQMakeMinGwVsCodeQMakeMsvcVsCodeCMakeMinGwVsCodeCMakeMsvcQtCreatorQMakeMinGw->VsCodeQtCreatorQMakeMsvc->VsCodeQtCreatorCMakeMinGw-&g…...

Linux中离线安装gcc

gcc在安装一些其他工具的经常用到&#xff0c;在此记录下如何安装gcc。 1.在线安装 yum -y install gcc 2.离线安装 2.1 获取安装包链接&#xff1a; https://pan.baidu.com/s/1oDvt64ByWs1w-evz5TXU7w?pwd9cfo mpfr-3.1.1-4.el7.x86_64.rpmlibmpc-1.0.1-3.el7.x86_64.rp…...

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一&#xff0c;同时也是企业最宝贵的资产之一。通常情况下&#xff0c;用户行为数据分析包含两大数据源&#xff1a;用户行为分析日志和上游关系型数据库&#xff08;如 MySQL&#xff09;。基于这些数据&#xff0c;企…...

【python 迪杰斯特拉-最短路径算法】

- 算法实现 import heapq import networkx as nx import matplotlib.pyplot as pltdef dijkstra(graph, start, goal):distances {node: float("infinity") for node in graph}distances[start] 0parents {node: None for node in graph}priority_queue [(0, st…...

从〇开始深度学习(0)——背景知识与环境配置

从〇开始深度学习(0)——背景知识与环境配置 文章目录 从〇开始深度学习(0)——背景知识与环境配置写在前面1.背景知识1.1.Pytorch1.2.Anaconda1.3.Pycharm1.4.CPU与GPU1.5.整体关系 2.环境配置2.1.准备工作2.1.1.判断有无英伟达显卡2.1.2.清理电脑里的旧环境 2.1.安装Anaconda…...

【NLP 2、机器学习简介】

人生的苦难不过伏尔加河上的纤夫 —— 24.11.27 一、机器学习起源 机器学习的本质 —— 找规律 通过一定量的训练样本找到这些数据样本中所蕴含的规律 规律愈发复杂&#xff0c;机器学习就是在其中找到这些的规律&#xff0c;挖掘规律建立一个公式&#xff0c;导致对陌生的数…...

多目标优化算法——多目标粒子群优化算法(MOPSO)

Handling Multiple Objectives With Particle Swarm Optimization&#xff08;多目标粒子群优化算法&#xff09; 一、摘要&#xff1a; 本文提出了一种将帕累托优势引入粒子群优化算法的方法&#xff0c;使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…...

Edify 3D: Scalable High-Quality 3D Asset Generation

Deep Imagination Research | NVIDIA 目录 一、Abstract 二、核心内容 1、多视图扩散模型 3、重建模型&#xff1a; 4、数据处理模块&#xff1a; 三、结果 1、文本到 3D 生成结果 2、图像到 3D 生成结果 3、四边形网格拓扑结构 一、Abstract NVIDIA 开发的用于高质量…...

探索校企合作新模式:职业院校大数据专业实验(实训)室建设指南

一、引言 作为一种强大的信息处理与分析工具&#xff0c;大数据技术在企业管理、科研探索、社会治理等多个领域均产生了广泛而深远的影响。在此背景下&#xff0c;大数据实验室的建设显得尤为重要&#xff0c;而校企合作则为这一建设提供了坚实的支撑。学校借助企业资源&#…...

YOLO的框架及版本迭代

YOLO&#xff08;You Only Look Once&#xff09;是一种非常流行的实时目标检测算法&#xff0c;其特点是将目标检测任务转换为一个回归问题&#xff0c;通过一次前向传播就可以同时完成目标的分类和定位。以下是YOLO框架的整体架构和工作原理&#xff1a; 一、YOLO的基本框架…...

第四十篇 DDP模型并行

摘要 分布式数据并行(DDP)技术是深度学习领域中的一项重要技术,它通过将数据和计算任务分布在多个计算节点上,实现了大规模模型的并行训练。 DDP技术的基本原理是将数据和模型参数分割成多个部分,每个部分由一个计算节点负责处理。在训练过程中,每个节点独立计算梯度,…...

鸿蒙进阶篇-状态管理之@Provide与@Consume

大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天我们来学习一下状态管理中的Provide与Consume。 一、概述 嘿&#xff01;大家还记得这张图吗&#xff1f;不记得也要记得哦&#xff0c;因为这张图里的东西&#xff0c;既是高频必考面试题&#xff0c;也是实际开发中&…...

鸿蒙本地模拟器 模拟TCP服务端的过程

鸿蒙模拟器模拟TCP服务端的过程涉及几个关键步骤&#xff0c;主要包括创建TCPSocketServer实例、绑定IP地址和端口、监听连接请求、接收和发送数据以及处理连接事件。以下是详细的模拟过程&#xff1a; **1.创建TCPSocketServer实例&#xff1a;**首先&#xff0c;需要导入鸿蒙…...

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…...

Spring Boot + ActiveMQ Artemis:快速实现高效消息队列处理功能

在现代微服务架构中&#xff0c;消息队列是实现异步通信、解耦系统的重要手段。而通过 Spring Boot 和 ActiveMQ Artemis&#xff0c;您可以快速搭建一个高效、可靠的消息队列处理系统&#xff0c;轻松应对订单处理、日志分析等场景。本文将带您从零开始&#xff0c;逐步实现一…...

【FPGA-MicroBlaze】串口收发以及相关函数讲解

前言 工具&#xff1a;Vivado2018.3及其所对应的SDK版本 目前网上有许多MicroBlaze 的入门教程&#xff0c;比如下面的这个参考文章&#xff0c;用串口打印一个hello world。 【FPGA】Xilinx MicroBlaze软核使用第一节&#xff1a;Hello World!_fpga软核microblaze-CSDN博客 个…...

CGAL CGAL::Polygon_mesh_processing::self_intersections解析

CGAL::Polygon_mesh_processing::self_intersections 是用于检测多边形网格&#xff08;Polygon Mesh&#xff09;中的自相交的函数。自相交是指网格中的某些面&#xff08;例如三角形&#xff09;与同一网格中的其他面交叉的情况。这种情况通常是不期望的&#xff0c;因为它会…...

猎户星空发布MoE大模型,推出AI数据宝AirDS

发布 | 大力财经 11月27日&#xff0c;猎户星空联合聚云科技举办了题为《Data Ready for Al&#xff0c;MoE大模型发布暨商业闭环分享》媒体见面会。猎户星空正式发布了自主研发的Orion-MoE 87B大模型&#xff0c;并携手聚云科技推出了基于该大模型的数据服务—AI数据宝AirDS&a…...

什么是JSON,有什么特点

什么是 JSON&#xff1f; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。它基于 JavaScript 的子集&#xff0c;但独立于语言&#xff0c;被广泛用于服务器与 Web 应…...

SQL注入SQL盲注

SQL注入&#xff08;SQL Injection&#xff09;和 SQL盲注&#xff08;Blind SQL Injection&#xff09;是两种常见的Web安全攻击技术&#xff0c;用于攻击应用程序并操纵其与数据库的交互。以下是两者的概念和区别&#xff1a; 1. SQL注入 定义&#xff1a; SQL注入是通过将…...

汽车轮毂结构分析有哪些?国产3D仿真分析实现静力学+模态分析

本文为CAD芯智库原创&#xff0c;未经允许请勿复制、转载&#xff01; 之前分享了如何通过国产三维CAD软件如何实现「汽车/汽配行业产品设计」&#xff0c;兼容NX&#xff08;UG&#xff09;、Creo&#xff08;Proe&#xff09;&#xff0c;轻松降低企业上下游图纸交互成本等。…...

C++设计模式之组合模式在解决层次性问题中的好处

采用组合模式在处理层次型问题时&#xff0c;会带来以下重要好处&#xff1a; 简化客户端操作&#xff1a; 客户端代码可以统一地处理单个对象和组合对象&#xff0c;而无需区分它们。这意味着客户端可以使用相同的操作来对待所有对象&#xff0c;无论它们是简单的叶子节点还是…...

基于大数据爬虫+SpringBoot+Hive的网络电视剧收视率分析与可视化平台系统(源码+论文+PPT+部署文档教程等)

博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringB…...

【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输

前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…...

️ 如何优化爬虫程序以提高抓取效率?

在开发爬虫程序时&#xff0c;提高抓取效率是至关重要的。以下是一些常见的性能优化策略&#xff0c;可以帮助你优化Java爬虫程序&#xff1a; 多线程与分布式抓取&#xff1a; 利用多线程技术可以显著提高爬虫的抓取速度。例如&#xff0c;在WebMagic中&#xff0c;可以通过配…...

深入理解 MySQL 锁机制:分类、实现与优化

在高并发的数据库应用中&#xff0c;锁机制是保障事务在操作数据库时数据一致性和完整性的重要工具。MySQL 提供了多种类型的锁&#xff0c;不同的存储引擎和场景下的实现各具特点。本篇文章将详细介绍 MySQL 锁的分类、实现&#xff08;主动与被动&#xff09;以及优化策略。 …...

python-docx -- 读取word页眉、页脚

文章目录 sections介绍访问section添加section页眉、页脚综合案例:sections介绍 word支持section的概念,即一个文档的划分部分,不同的部分均包含相同的页面布局设置,如相同的边距、页面方向等;在每个section中可以定义页眉、页脚来应用于该section下的所有页面;大部分wor…...