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

【Linux】线程池和线程补充内容

在这里插入图片描述

个人主页~


线程池

  • 一、线程池简介
    • 单例模式线程池简介
  • 二、单例模式线程池的实现
    • 1、ThreadPool.hpp
    • 2、Task.hpp
    • 3、main.cpp
  • 三、其他常见锁
    • 读写锁

一、线程池简介

池化技术我们并不陌生,我们在前面的文章中实现过进程池,这里线程池的作用也是先申请资源交给用户区,然后用户在使用的时候就不用再去内核申请了,直接去池中申请,效率提高,是一种以空间换时间的方法

单例模式线程池简介

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例,核心思想是限制一个类只能创建一个对象,并提供一个统一的方法让其他代码可以访问这个唯一的对象,这样可以避免在系统中创建多个功能相同的对象,从而节省系统资源,保证数据的一致性和操作的一致性

单例的实现有两种方式,被称为饿汉方式和懒汉方式,饿汉方式的核心思想是在类加载时就创建单例实例,无论后续是否会使用该实例,这种方式利用了静态成员变量的特性,在程序启动时,类的静态成员变量会被自动初始化,从而保证实例的唯一性,懒汉方式的核心思想是在第一次使用单例实例时才进行创建,即 “延迟加载”,这种方式避免了在程序启动时就创建实例,从而减少了不必要的资源消耗

二、单例模式线程池的实现

1、ThreadPool.hpp

#pragma once#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <pthread.h>
#include <unistd.h>struct ThreadInfo
{pthread_t tid;std::string name;
};static const int defalutnum = 5;template <class T>
class ThreadPool
{
public:void Lock(){pthread_mutex_lock(&mutex_);}void Unlock(){pthread_mutex_unlock(&mutex_);}void Wakeup(){pthread_cond_signal(&cond_);}void ThreadSleep(){pthread_cond_wait(&cond_, &mutex_);}bool IsQueueEmpty(){return tasks_.empty();}std::string GetThreadName(pthread_t tid){for (const auto &ti : threads_){if (ti.tid == tid)return ti.name;}return "None";}public:static void *HandlerTask(void *args){ThreadPool<T> *tp = static_cast<ThreadPool<T> *>(args);std::string name = tp->GetThreadName(pthread_self());while (true){tp->Lock();while (tp->IsQueueEmpty()){tp->ThreadSleep();}T t = tp->Pop();tp->Unlock();t();std::cout << name << " run, "<< "result: " << t.GetResult() << std::endl;}}void Start(){int num = threads_.size();for (int i = 0; i < num; i++){threads_[i].name = "thread-" + std::to_string(i + 1);pthread_create(&(threads_[i].tid), nullptr,HandlerTask, this);}}T Pop(){T t = tasks_.front();tasks_.pop();return t;}void Push(const T &t){Lock();tasks_.push(t);Wakeup();//唤醒线程Unlock();}//实现单例模式,确保线程池只有一个实例static ThreadPool<T> *GetInstance(){//这里套两层if判断是为了避免多个线程同时通过第一次检查而创建多个实例//只有在第一次进入的时候tp_有可能等于nullptr,之后就不可能会了,在外面再加一层//可以判断完直接跳过括号中的代码,不去争夺锁if (nullptr == tp_){pthread_mutex_lock(&lock_);if (nullptr == tp_){std::cout << "log: singleton create done first!" << std::endl;tp_ = new ThreadPool<T>();}pthread_mutex_unlock(&lock_);}return tp_;}private://单例模式要把构造函数私有化,不被类外访问到ThreadPool(int num = defalutnum) : threads_(num){pthread_mutex_init(&mutex_, nullptr);pthread_cond_init(&cond_, nullptr);}~ThreadPool(){pthread_mutex_destroy(&mutex_);pthread_cond_destroy(&cond_);}//删除拷贝构造函数,防止线程池对象被拷贝ThreadPool(const ThreadPool<T> &) = delete;//删除赋值运算符,防止线程池对象被赋值const ThreadPool<T> &operator=(const ThreadPool<T> &) = delete; 
private:std::vector<ThreadInfo> threads_;std::queue<T> tasks_;//存储任务的队列pthread_mutex_t mutex_;//用于保护任务队列的互斥锁pthread_cond_t cond_;//用于线程同步的条件变量static ThreadPool<T> *tp_;//静态指针,用于实现单例模式static pthread_mutex_t lock_;//静态互斥锁,用于在创建单例时进行线程同步
};//静态成员变量初始化
template <class T>
ThreadPool<T> *ThreadPool<T>::tp_ = nullptr;template <class T>
pthread_mutex_t ThreadPool<T>::lock_ = PTHREAD_MUTEX_INITIALIZER;

2、Task.hpp

#pragma once
#include <iostream>
#include <string>std::string opers="+-*/%";enum{DivZero=1,ModZero,Unknown
};class Task
{
public:Task(){}Task(int x, int y, char op) : data1_(x), data2_(y), oper_(op), result_(0), exitcode_(0){}void run(){switch (oper_){case '+':result_ = data1_ + data2_;break;case '-':result_ = data1_ - data2_;break;case '*':result_ = data1_ * data2_;break;case '/':{if(data2_ == 0) exitcode_ = DivZero;else result_ = data1_ / data2_;}break;case '%':{if(data2_ == 0) exitcode_ = ModZero;else result_ = data1_ % data2_;}            break;default:exitcode_ = Unknown;break;}}void operator ()(){run();}std::string GetResult(){std::string r = std::to_string(data1_);r += oper_;r += std::to_string(data2_);r += "=";r += std::to_string(result_);r += "[code: ";r += std::to_string(exitcode_);r += "]";return r;}std::string GetTask(){std::string r = std::to_string(data1_);r += oper_;r += std::to_string(data2_);r += "=?";return r;}~Task(){}private:int data1_;int data2_;char oper_;int result_;int exitcode_;
};

3、main.cpp

#include <iostream>
#include <ctime>
#include "ThreadPool.hpp"
#include "Task.hpp"int main()
{std::cout << "process running..." << std::endl;ThreadPool<Task>::GetInstance()->Start();srand(time(nullptr));while(true){//构建任务int x = rand() % 10 + 1;usleep(10);int y = rand() % 5;char op = opers[rand()%opers.size()];Task t(x, y, op);ThreadPool<Task>::GetInstance()->Push(t);//交给线程池处理std::cout << "main thread make task: " << t.GetTask() << std::endl;sleep(1);}
}

在这里插入图片描述

三、其他常见锁

  • 悲观锁:在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁,当其它线程想要访问数据时,被阻塞挂起,互斥锁就是悲观锁

  • 乐观锁: 每次取数据的时候,总是乐观的认为数据不会被其他线程修改,因此不上锁,但是在更新数据前,会判断其他线程在更新前有没有对数据进行修改,主要采用两种方式:版本号机制和 CAS 操作

  • CAS 操作:当需要更新数据时,判断当前内存值和之前取得的值是否相等,如果相等则用新值更新,若不等则失败,失败则重试,一般是一个自旋的过程,即不断重试

  • 自旋锁:当一个进程申请锁失败时,不是将自己挂起,而是继续去申请锁,使用这种锁的前提是,线程在临界区中执行的时间要足够的短

读写锁

读写锁是一种同步机制,用于在多线程环境中对共享资源进行并发访问控制,它允许多个线程同时进行读操作,但在进行写操作时会独占资源,以保证数据的一致性和完整性

  • 基本概念:读写锁将对共享资源的访问分为读操作和写操作两种类型,多个线程可以同时获取读锁,并行地进行读操作,因为读操作不会修改共享资源,不会产生数据竞争问题,而写操作是独占的,当一个线程获取写锁时,其他线程无论是读操作还是写操作都必须等待,直到写锁被释放

  • 读写锁的三种状态

    • 无锁状态:此时没有线程持有读锁或写锁,任何线程都可以尝试获取读锁或写锁
    • 读锁状态:有一个或多个线程持有读锁,此时可以有其他线程继续获取读锁,但不能有线程获取写锁
    • 写锁状态:有一个线程持有写锁,此时其他线程不能获取读锁或写锁,直到写锁被释放
  • 优点

    • 并发性能高:允许多个线程同时进行读操作,提高了对共享资源的并发访问能力,特别适用于读多写少的场景
    • 数据一致性:写操作是独占的,保证了在写操作期间不会有其他线程同时访问共享资源,从而确保了数据的一致性
  • 缺点

    • 实现复杂:读写锁的实现比普通的互斥锁更复杂,需要处理读锁和写锁的竞争关系
    • 写饥饿问题:在高并发的读操作场景下,可能会出现写线程长时间无法获取写锁的情况,即写饥饿问题
  • 使用场景

    • 适用于读操作频繁、写操作较少的场景,例如:
    • 缓存系统:缓存系统通常需要频繁读取数据,而更新数据的操作相对较少,使用读写锁可以让多个线程同时读取缓存,提高缓存的访问性能
    • 配置文件管理:配置文件在程序运行过程中通常只需要读取,而修改配置文件的操作比较少,使用读写锁可以让多个线程同时读取配置文件,而在修改配置文件时进行独占访问

今日分享就到这了~

在这里插入图片描述

相关文章:

【Linux】线程池和线程补充内容

个人主页~ 线程池 一、线程池简介单例模式线程池简介 二、单例模式线程池的实现1、ThreadPool.hpp2、Task.hpp3、main.cpp 三、其他常见锁读写锁 一、线程池简介 池化技术我们并不陌生&#xff0c;我们在前面的文章中实现过进程池&#xff0c;这里线程池的作用也是先申请资源交…...

vue3内置组件Suspense的使用

Suspense 实验性功能<Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化 <Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异…...

怪物猎人:世界-冰原10000+mod整合包5月最新更新!

700A大全套精美服装 800M大全套精美服装 3月31日更新 新增 新武器 新特效MOD 当前共计5800MOD整合包 好看的发型mod 实用的功能mod 炫酷的武器mod 新服装新特效新武器实用模组美化&#xff0c;等。 1月14日更新 新增皮肤MOD 500 当前共计2000MOD 1月16日更新 新增超…...

题解:洛谷 CF2091E Interesting Ratio

思路推导 我们先对 32 32 32 和 96 96 96 进行二进制拆分。 相同部分&#xff08;用 α \alpha α 表示&#xff09;&#xff1a; 5 5 5 个 2 2 2。 不同部分&#xff08;用 β \beta β 表示&#xff09;&#xff1a; 1 1 1 和 3 3 3。 gcd ⁡ ( 32 , 96 ) \gcd(32,9…...

PETR和位置编码

PETR和位置编码 petr检测网络中有2种类型的位置编码。 正弦编码和petr论文提出的3D Position Embedding。transformer模块输入除了qkv&#xff0c;还有query_pos和key_pos。这里重点记录下query_pos和key_pos的生成 query pos的生成 先定义reference_points, shape为(n_query…...

《社交类应用开发:React Native与Flutter的抉择》

社交类应用以令人目不暇接的速度更新迭代。新功能不断涌现&#xff0c;从更智能的算法推荐到多样化的互动形式&#xff0c;从增强的隐私保护到跨平台的无缝体验&#xff0c;每一次更新都旨在满足用户日益增长且多变的需求。面对如此高频的更新需求&#xff0c;选择合适的跨端框…...

多模态大语言模型arxiv论文略读(五十三)

Red Teaming GPT-4V: Are GPT-4V Safe Against Uni/Multi-Modal Jailbreak Attacks? ➡️ 论文标题&#xff1a;Red Teaming GPT-4V: Are GPT-4V Safe Against Uni/Multi-Modal Jailbreak Attacks? ➡️ 论文作者&#xff1a;Shuo Chen, Zhen Han, Bailan He, Zifeng Ding, …...

POI从入门到上手(三)-轻松完成EasyExcel使用,完成Excel导入导出.

前言: Apache POI 是一个流行的 Java 库&#xff0c;用于处理 Microsoft Office 格式文件&#xff0c;提供丰富 API 来创建、读取和修改 Office 文档。 1.官网&#xff1a;Apache POI™ - the Java API for Microsoft Documents 2.优点&#xff1a;功能强大&#xff0c;可处…...

使用Delphi 和 CrossVcl 开发基于VCL的 macOS 和 Linux 应用程序简介

CrossVcl 快速入门 大家都知道delphi可以开发linux程序&#xff0c;更多的是知道FMXLinux开发基于FMX的程序&#xff0c;这里给大家介绍使用 Embarcadero Delphi 和 CrossVcl 开发基于VCL的 macOS 和 Linux 应用程序。 概述 CrossVcl 是一个工具链&#xff0c;允许使用 Emb…...

Android Kotlin 项目完整集成 Bugly 异常监控指南

Android Kotlin 项目集成 Bugly 异常监控完整指南 一、Bugly 简介 Bugly 是腾讯提供的专业移动应用异常监控平台&#xff0c;支持&#xff1a; 崩溃报告&#xff08;Java/Native&#xff09;错误分析性能监控热更新功能&#xff08;需额外配置&#xff09; 二、集成步骤 1…...

C++使用accumulate函数对数组进行快速求和

C使用accumulate函数对数组进行快速求和 一、普通数组 1.1方法&#xff1a; 1.先求出数组的长度&#xff1a; int size sizeof(arr) / sizeof(arr[0]); 2.使用指针作为迭代器调用accumulate函数&#xff1a;int sum std::accumulate(arr, arr size, 0); 3.注意带上头文…...

【音视频】RTMP流媒体服务器搭建、推流拉流

服务器&#xff1a;SRS(Simple RTMP Server&#xff0c;⽀持RTMP、HTTP-FLV&#xff0c;HLS) 推流端&#xff1a;ffmpeg OBS 拉流端&#xff1a;ffplay VLC srs播放器 1 安装和测试srs流媒体服务器 1.1 安装srs流媒体服务器 srs官⽹&#xff1a;https://github.com/ossrs/…...

React Router

为什么需要路由&#xff1f; 单页应用&#xff08;SPA&#xff09;&#xff1a;在单页面中实现多视图切换&#xff0c;避免整页刷新。 核心功能&#xff1a; 根据 URL 路径渲染对应组件。 实现页面间导航&#xff08;前进、后退、跳转&#xff09;。 支持动态路由、嵌套路由…...

加载ko驱动模块:显示Arm版本问题解决!

1、问题 驱动模块加载&#xff0c;使用命令&#xff1a;modprobe chrdevbase.ko 时出现&#xff1a; hrdevbase: version magic 4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8 ’ should be 4.1.15 SMP preempt mod_unload modversions ARMv7 p2v8 ’ ———————…...

OpenGL-ES 学习(9) ---- OpenGL-ES 简介和基本 Pipeline

目录 OpenGL-ES 简介渲染管线顶点和顶点着色器图元装配和光栅化片段和片段着色器逐片段操作EGL OpenGL-ES 简介 OpenGL-ES(OpenGL for Embedded System)是以手持和嵌入式设备为目标的高级3D图形应用编程接口&#xff0c;OpenGL ES 支持的的平台包括 IOS&#xff0c;Android&am…...

计算机视觉(CV)技术的优势和挑战(本片为InsCode)

计算机视觉&#xff08;CV&#xff09;技术是一种利用计算机和算法来模拟人类视觉实现图像和视频处理的技术。它在各个领域都有着广泛的应用&#xff0c;具有许多优势和挑战。 优势&#xff1a; 自动化&#xff1a;CV 技术可以自动识别、分类、跟踪和分析图像和视频数据&…...

Unity 几种主流的热更新方式

一、AssetBundle 资源热更 核心原理 将游戏资源打包为 AssetBundle 文件 运行时动态加载更新的 AssetBundle 实现步骤 资源标记&#xff1a;在 Unity Editor 中设置资源的 AssetBundle 属性 打包生成&#xff1a;使用 BuildPipeline.BuildAssetBundles 生成 AB 包 版本管…...

小结:ipsec-ike

IPSec 手动配置与自动配置&#xff08;IKE动态协商&#xff09; 手动配置IPSec 逻辑图 #mermaid-svg-eNMnNEwnoTjF8fkV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eNMnNEwnoTjF8fkV .error-icon{fill:#552222;}…...

基于大模型预测的输尿管癌诊疗全流程研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测输尿管癌的原理与方法 2.1 大模型技术概述 2.2 用于输尿管癌预测的大模型选择 2.3 数据收集与处理 2.4 模型训练与优化 三、术前风险预测与手术方案制定 3.1 术前风险预测指标 3.2 大模型预测…...

Python Cookbook-6.14 实现状态设计模式

任务 你希望你程序中的某个对象能在不同的“状态”之间切换&#xff0c;而且该对象的行为方式也能随着状态的变化而变化。 解决方案 状态设计模式的关键思路是将“状态”(带有它自身的行为方式)对象化&#xff0c;使其成为一个类实例(带有一些方法)。在Python中&#xff0c;…...

2025智能体的发展趋势

以下是2025年智能体的一些主要发展趋势&#xff1a; 技术能力提升 多模态融合深化&#xff1a;智能体将能够更加自然地处理和理解多种模态的数据&#xff0c;如文本、图像、语音、视频等&#xff0c;实现跨模态的感知、理解和生成。这将使智能体在复杂场景下的应用更加广泛和…...

PCA主成分分析法(最大投影方差,最小重构距离,SVD角度)

统计分析中&#xff0c;数据的变量之间可能存在相关性&#xff0c;以致增加了分析的难度。于是&#xff0c;考虑由少数不相关的变量来代替相关的变量&#xff0c;用来表示数据&#xff0c;并且要求能够保留数据中的大部分信息。 在信号处理领域,信号具有较大方差,噪声具有较小…...

《数据结构初阶》【顺序表/链表 精选15道OJ练习】

《数据结构初阶》【顺序表/链表 精选15道OJ练习】 前言&#xff1a;---------------顺序表OJ练习---------------[26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)题目介绍方法一&#xff1a; [27. 移除元素](https://leetco…...

Python协程入门指北

一、什么是协程&#xff1f; 协程&#xff08;Coroutine&#xff09;就像可以暂停执行的函数&#xff0c;能够在执行过程中主动让出控制权&#xff0c;等准备好后再继续执行。 生活小例子 想象你在咖啡店排队&#xff1a; 普通函数&#xff1a;必须一直排到取餐&#xff08…...

Nginx 核心功能02

目录 一、引言 二、正向代理 &#xff08;一&#xff09;正向代理基础概念 &#xff08;二&#xff09;Nginx 正向代理安装配置 &#xff08;三&#xff09;正向代理配置与验证 三、反向代理 &#xff08;一&#xff09;反向代理原理与应用场景 &#xff08;二&#xf…...

c++题目_P1027 [NOIP 2001 提高组] Car 的旅行路线

P1027 [NOIP 2001 提高组] Car 的旅行路线 - 洛谷 # P1027 [NOIP 2001 提高组] Car 的旅行路线 ## 题目描述 又到暑假了&#xff0c;住在城市 A 的 Car 想和朋友一起去城市旅游。 她知道每个城市都有 $4$ 个飞机场&#xff0c;分别位于一个矩形的 $4$ 个顶点上&#xff0c…...

【playwright】内网离线部署playwright

背景&#xff1a;安装好python3.9后&#xff0c;由于内网无法使用pip安装playwright&#xff0c;多方收集资料&#xff0c;终于部署完成&#xff0c;现汇总如下&#xff1a; 1、playwright需要python3.7以上的版本&#xff0c;如果低于这个版本先要将python解释器升级 2、在可…...

前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制

看完本篇你将基本了解webpack!!! 目录 一、Webpack 的作用 1、基本配置结构 2、配置项详解 1. entry —— 构建入口 2. output —— 输出配置 3. mode:模式设置 4. module:模块规则 5. plugins:插件机制 6. resolve:模块解析配置(可选) 7. devServer:开发服务器…...

ES6函数、对象和面向对象扩展

函数扩展 默认参数 通用的写法&#xff1a; function func(a, b, ..., c 默认值c, d 默认值d, ...) {... }其中&#xff0c;需要注意的是&#xff0c;有默认值的尽量写在后面并且所有形参参数不允许重复申明。具体例子&#xff1a; function test() {return 13 }// 函数可…...

航空客户价值分析阶段性测验

航空公司客户价值分析 学习目标 学会怎么进行数据分析。掌握hive的使用方法。学会数据清洗和K-Means聚类算法。 了解航空公司现状与客户价值分析 任务描述 面对激烈的市场竞争,各个航空公司都推出了更多的优惠来吸引客户。国内某航空公司面临着常旅客流失&#xff0c;竞争…...

纯html实现的json数据转csv文件

代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JSON转CSV转换器</tit…...

Windows 查看电脑是否插拔过U盘

1、按 “WinR” 组合键打开 “运行” 对话框&#xff0c;输入 “regedit” 并回车&#xff0c;打开注册表编辑器。 2、依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR注册表项&#xff0c;这里记录了所有已连接过的 USB 设备信息&#xff0c;包括 U 盘&am…...

VB.net序列化和反序列化的使用方法和实用场景

引言 相信很多初学编程的人都会提出过这个疑问&#xff1a;“既然我的变量可以存在内存之中&#xff0c;那么是否也可以存在硬盘之中呢” 其实我想回答的是&#xff0c;完全可以而且方法不止一种&#xff0c;而今天讲的是序列化最经典的——二进制序列化 由于序列化的部分已…...

kafka学习笔记(四、生产者(客户端)深入研究(二)——消费者协调器与_consumer_offsets剖析)

1.消费者协调器和组协调器 如果消费者客户端中配置了多个分配策略&#xff0c;则多消费者的分区分配交由消费者协调器和组协调器来完成&#xff0c;他们之间使用一套组协调协议进行交互。 1.1.在均衡原理 将全部消费者分成多个子集&#xff0c;每个消费者组的子集在服务中对…...

stm32基础001(串口)

文章目录 通信的基本概念串行通信和并行通信单工&#xff0c;半双工和全双工串口的硬件连接 stm32的串口原理图CPU的芯片手册stm32串口的库函数实现通过串口实现printf函数使用中断实现串口的接收 通信的基本概念 串行通信和并行通信 串行通信一个方向只有一个数据通道&#x…...

5G技术如何提升智能家居体验:让家更聪明,生活更智能

5G技术如何提升智能家居体验&#xff1a;让家更聪明&#xff0c;生活更智能 一、引言&#xff1a;智能家居的新纪元 近年来&#xff0c;智能家居已经逐渐走入我们的生活&#xff0c;家电、照明、安全设备、环境监控等产品&#xff0c;都在逐步实现智能化&#xff0c;让我们可以…...

在项目中如何对Map List等对象序列化及反序列化

我们知道&#xff0c;在自定义类中&#xff0c;若想完成序列化必须要实现Serializable接口。 那么在实现后如何进行序列化呢&#xff1f; 一.普通对象 序列化&#xff1a; 1.首先我们要定义一个 序列化所需要的工具类 ObjectMapper //定义序列化所需要的工具类 转化机器…...

指针与算法的双人舞:蓝桥杯两道趣味题的降维打击

蓝桥杯奇趣挑战&#xff1a;如何用指针和算法“驯服”无序数组与环形迷宫&#xff1f; &#x1f3a9; 博客引言 "你是否有过这样的体验&#xff1f;面对一段看似混乱的数组&#xff0c;像解开一团纠缠的耳机线&#xff0c;想用最优雅的方式让它乖乖听话&#xff1f;又或者…...

C语言 指针(2)

目录 1.指针运算 2.const修饰指针 3.野指针 我们在上篇文章中初步了解了关于指针的基础内容&#xff0c;包括内存地址以及指针变量类型。这篇我们来 讲关于指针的运算以及const修饰指针和野指针相关内容。 1. 指针运算 指针的基本运算有三种&#xff0c;分别是: - 指针-…...

使用Python和Pandas实现的Azure Synapse Dedicated SQL pool权限检查与SQL生成用于IT审计

下面是使用 Python Pandas 来提取和展示 Azure Synapse Dedicated SQL Pool 中权限信息的完整过程&#xff0c;同时将其功能以自然语言描述&#xff0c;并自动构造所有权限设置的 SQL 语句&#xff1a; ✅ 步骤 1&#xff1a;从数据库读取权限信息 我们从数据库中提取与用户、…...

Python基本语法(控制语句)

#控制语句 Python语言的控制语句和其他编程语言类似&#xff0c;常用的有if…else、while、for语句。 案例2一7控制语句 第1组代码&#xff0c;说明if-else语句&#xff1a; #1 print(\n1,if) x,y,z10,20,5 if x>y:print(x>y) else:print(x<y)输出结果: 1,if x<…...

Linux btop 使用教程

简介 btop 是一个基于终端的现代系统资源监控器&#xff0c;具有美观的图形界面、响应快、功能丰富等特点。它支持查看 CPU、内存、磁盘、网络、进程&#xff0c;并可以方便地筛选和管理进程。 功能总览 启动命令&#xff1a; btop界面分为以下几部分&#xff1a; CPU 区域…...

高并发场景下的MySQL生存指南

引言 在2025年全球数字经济峰会上&#xff0c;阿里云披露其核心交易系统单日处理请求量突破万亿次&#xff0c;其中MySQL集群承载了78%的OLTP业务。这标志着数据库系统已进入百万级QPS时代&#xff0c;传统优化手段面临三大挑战&#xff1a; 一、硬件与架构优化&#xff1a;构…...

Ethan独立开发产品日报 | 2025-04-30

1. Daytona 安全且灵活的基础设施&#xff0c;用于运行你的人工智能生成代码。 Daytona Cloud重新定义了AI代理的基础设施&#xff0c;具备低于90毫秒的启动时间、原生性能和有状态执行能力&#xff0c;这些是传统云服务无法比拟的。您可以以前所未有的速度和灵活性来创建、管…...

Mysql常用函数解析

字符串函数 CONCAT(str1, str2, …) 将多个字符串连接成一个字符串。 SELECT CONCAT(Hello, , World); -- 输出: Hello World​​SUBSTRING(str, start, length) 截取字符串的子串&#xff08;起始位置从1开始&#xff09;。 SELECT SUBSTRING(MySQL, 3, 2); -- 输出: SQ…...

donet使用指定版本sdk

ps:来自微软官方方案,实测可行,就是在项目任意目录下在新建 global.json,并配置sdk版本 SDK 使用最新安装的版本 SDK 命令包括 dotnet new 和 dotnet run。 .NET CLI 必须为每个 dotnet 命令选择一个 SDK 版本。 即使在以下情况下&#xff0c;它也会默认使用计算机上安装的最新…...

Android短信监控技术实现:合法合规的远程采集方案

一年经验的全栈程序员&#xff0c;目前头发健在&#xff0c;但不知道能撑多久。 该项目已成功部署并稳定运行于企业生产环境&#xff0c;如需个性化定制方案&#xff0c;欢迎联系作者进行深度合作。 文章目录 前言 一、页面设计 1.页面显示 2.代码实现 二、具体代码实现 1.添加…...

前端项目实践:打造响应式个人简历与实时天气预报应用

在当今前端开发领域&#xff0c;构建实际项目是提升技能的最佳方式。本文将带你完成两个极具实用价值的前端项目&#xff1a;响应式个人简历页面和天气预报Web应用。这两个项目不仅能够丰富你的作品集&#xff0c;还能帮助你掌握现代前端开发的核心技术。 一、响应式个人简历页…...

【C++】extern

本文介绍一些extern在C中的用法 声明与定义分离 C程序员应该都知道单一定义规则ODR 在任何一个翻译单元中&#xff0c;只允许存在任何变量、函数、类类型、枚举类型 、概念 (自 C20 起) 或模板的一个定义&#xff08;其中一些可能具有多个声明&#xff0c;但只允许一个定义&a…...

力扣——23合并升序链表

目录 1:题目描述&#xff1a; 2.算法思想&#xff1a; 3.代码展示&#xff1a; 1:题目描述&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff…...