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

C++中的无锁编程

引言

在当今多核处理器普及的时代,并发编程已成为高性能应用程序开发的关键技术。传统的基于锁的同步机制虽然使用简单,但往往会带来性能瓶颈和死锁风险。无锁编程(Lock-Free Programming)作为一种先进的并发编程范式,通过避免使用互斥锁,能够显著提高并发程序的性能和可扩展性。本文将深入探讨C++中的无锁编程技术,包括其基本概念、实现方法、常见模式以及实际应用中的注意事项。

无锁编程的基本概念

无锁编程是一种不使用互斥锁而实现线程同步的技术。在无锁算法中,即使某个线程的执行被挂起,其他线程仍然能够继续执行而不会被阻塞。这种特性使得无锁算法在高并发环境下具有显著的性能优势。

无锁、无等待与无障碍

在讨论无锁编程时,我们通常会涉及以下几个概念:

  • 无障碍(Obstruction-Free):如果一个线程在其他线程都暂停的情况下能够在有限步骤内完成操作,则该算法是无障碍的。
  • 无锁(Lock-Free):如果系统中总有线程能够取得进展,则该算法是无锁的。无锁算法保证系统整体的进展,但不保证每个线程都能取得进展。
  • 无等待(Wait-Free):如果每个线程都能在有限步骤内完成操作,则该算法是无等待的。无等待是最强的保证,它确保每个线程都能取得进展。

无锁编程的核心在于使用原子操作和内存序来协调线程间的交互,而不是依赖传统的锁机制。

C++原子操作

C++11引入了<atomic>库,提供了对原子操作的支持,这是实现无锁编程的基础。

原子类型

std::atomic是一个模板类,可以将基本类型包装为原子类型:

#include <atomic>
#include <iostream>
#include <thread>
#include <vector>std::atomic<int> counter(0);void increment() {for (int i = 0; i < 1000; ++i) {counter++;  // 原子递增操作}
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 10; ++i) {threads.push_back(std::thread(increment));}for (auto& t : threads) {t.join();}std::cout << "Final counter value: " << counter << std::endl;return 0;
}

原子操作函数

除了基本的原子类型外,C++还提供了一系列原子操作函数:

  • std::atomic_load:原子读取
  • std::atomic_store:原子存储
  • std::atomic_exchange:原子交换
  • std::atomic_compare_exchange_weak/std::atomic_compare_exchange_strong:比较并交换(CAS操作)

CAS(Compare-And-Swap)操作是无锁编程中最常用的基本操作之一:

bool cas_example(std::atomic<int>& target, int expected, int desired) {return target.compare_exchange_strong(expected, desired);
}

内存序

在多处理器系统中,内存操作的顺序可能会因为编译器优化和处理器重排序而改变。C++11引入了内存序(Memory Ordering)的概念,允许程序员指定原子操作之间的顺序关系。

内存序类型

C++提供了六种内存序选项:

  • memory_order_relaxed:最宽松的内存序,只保证操作的原子性,不提供同步或顺序保证。
  • memory_order_consume:读操作依赖于特定的写操作。
  • memory_order_acquire:读操作,获取当前线程之前的所有写操作的结果。
  • memory_order_release:写操作,释放当前线程之前的所有写操作的结果。
  • memory_order_acq_rel:同时具有acquire和release语义。
  • memory_order_seq_cst:最严格的内存序,提供全序关系。

以下是一个使用不同内存序的示例:

#include <atomic>
#include <thread>
#include <iostream>std::atomic<bool> ready(false);
std::atomic<int> data(0);void producer() {data.store(42, std::memory_order_relaxed);ready.store(true, std::memory_order_release);
}void consumer() {while (!ready.load(std::memory_order_acquire)) {// 自旋等待}int value = data.load(std::memory_order_relaxed);std::cout << "Read value: " << value << std::endl;
}int main() {std::thread t1(producer);std::thread t2(consumer);t1.join();t2.join();return 0;
}

在这个例子中,memory_order_releasememory_order_acquire配对使用,确保consumer线程能够看到producer线程写入的数据。

无锁数据结构

基于原子操作和适当的内存序,我们可以实现各种无锁数据结构。

无锁队列

以下是一个简化版的无锁单生产者单消费者队列实现:

template<typename T>
class LockFreeQueue {
private:struct Node {T data;std::atomic<Node*> next;Node(const T& value) : data(value), next(nullptr) {}};std::atomic<Node*> head;std::atomic<Node*> tail;public:LockFreeQueue() {Node* dummy = new Node(T());head.store(dummy);tail.store(dummy);}~LockFreeQueue() {while (Node* node = head.load()) {head.store(node->next);delete node;}}void enqueue(const T& value) {Node* new_node = new Node(value);Node* old_tail = tail.exchange(new_node, std::memory_order_acq_rel);old_tail->next.store(new_node, std::memory_order_release);}bool dequeue(T& result) {Node* current_head = head.load(std::memory_order_acquire);Node* next = current_head->next.load(std::memory_order_acquire);if (!next) {return false;  // 队列为空}result = next->data;head.store(next, std::memory_order_release);delete current_head;return true;}
};

无锁栈

以下是一个基于CAS操作的无锁栈实现:

template<typename T>
class LockFreeStack {
private:struct Node {T data;Node* next;Node(const T& value) : data(value), next(nullptr) {}};std::atomic<Node*> head;public:LockFreeStack() : head(nullptr) {}~LockFreeStack() {while (Node* node = head.load()) {head.store(node->next);delete node;}}void push(const T& value) {Node* new_node = new Node(value);Node* old_head = head.load(std::memory_order_relaxed);do {new_node->next = old_head;} while (!head.compare_exchange_weak(old_head, new_node, std::memory_order_release,std::memory_order_relaxed));}bool pop(T& result) {Node* old_head = head.load(std::memory_order_acquire);do {if (!old_head) {return false;  // 栈为空}} while (!head.compare_exchange_weak(old_head, old_head->next,std::memory_order_release,std::memory_order_relaxed));result = old_head->data;delete old_head;return true;}
};

ABA问题及其解决方案

在无锁编程中,一个常见的问题是ABA问题:一个值从A变为B,再变回A,可能会导致CAS操作误认为该值没有被修改过。

ABA问题示例

考虑以下场景:

  1. 线程1读取一个指针值A
  2. 线程1被挂起
  3. 线程2将指针从A改为B,然后又改回A
  4. 线程1恢复执行,发现指针值仍为A,误认为没有发生变化

解决方案:标记指针

一种常见的解决方案是使用标记指针(Tagged Pointer)或版本计数器:

template<typename T>
class TaggedPointer {
private:struct TaggedPtr {T* ptr;uint64_t tag;};std::atomic<TaggedPtr> ptr;public:TaggedPointer(T* p = nullptr) {TaggedPtr tp = {p, 0};ptr.store(tp);}bool compareAndSwap(T* expected, T* desired) {TaggedPtr current = ptr.load();if (current.ptr != expected) {return false;}TaggedPtr newValue = {desired, current.tag + 1};return ptr.compare_exchange_strong(current, newValue);}T* get() {return ptr.load().ptr;}
};

C++11提供了std::atomic<std::shared_ptr<T>>,可以直接用于解决ABA问题,但其性能可能不如手动实现的标记指针。

无锁编程的实践建议

1. 谨慎选择内存序

选择合适的内存序对于无锁算法的正确性和性能至关重要。过于严格的内存序会导致性能下降,而过于宽松的内存序可能会导致程序错误。

2. 考虑内存管理

在无锁编程中,内存管理是一个复杂的问题。当一个线程释放一个对象时,其他线程可能仍在使用该对象。解决这个问题的方法包括:

  • 引用计数
  • 危险指针(Hazard Pointers)
  • 纪元计数(Epoch-based reclamation)
  • 读拷贝更新(Read-Copy-Update,RCU)

3. 全面测试

无锁算法的正确性难以验证,因此需要进行全面的测试,包括压力测试和并发测试。

4. 避免过度使用

无锁编程不是万能的。在许多情况下,简单的锁机制可能更适合,特别是当并发度不高或性能不是关键因素时。

性能对比与分析

为了展示无锁编程的性能优势,我们对比了基于锁的队列和无锁队列在不同线程数下的性能:

// 性能测试代码
#include <chrono>
#include <mutex>
#include <queue>
#include <thread>
#include <vector>
#include <iostream>// 基于锁的队列
template<typename T>
class LockedQueue {
private:std::queue<T> q;std::mutex mtx;public:void enqueue(const T& value) {std::lock_guard<std::mutex> lock(mtx);q.push(value);}bool dequeue(T& result) {std::lock_guard<std::mutex> lock(mtx);if (q.empty()) {return false;}result = q.front();q.pop();return true;}
};// 测试函数
template<typename Queue>
void benchmark(Queue& q, int num_threads, int operations_per_thread) {auto start = std::chrono::high_resolution_clock::now();std::vector<std::thread> threads;for (int i = 0; i < num_threads; ++i) {threads.push_back(std::thread([&q, operations_per_thread]() {for (int j = 0; j < operations_per_thread; ++j) {q.enqueue(j);int result;q.dequeue(result);}}));}for (auto& t : threads) {t.join();}auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);std::cout << "Time taken with " << num_threads << " threads: " << duration.count() << " ms" << std::endl;
}

测试结果表明,在高并发场景下,无锁队列的性能优势显著,特别是当线程数接近或超过CPU核心数时。

总结与展望

无锁编程作为一种高级并发编程技术,能够在高并发场景下提供显著的性能优势。C++11及后续标准通过提供原子操作和内存序模型,为无锁编程提供了坚实的基础。

然而,无锁编程也面临着诸多挑战,包括复杂的内存管理、难以验证的正确性以及潜在的ABA问题。随着硬件和编程语言的发展,我们可以期待更多的工具和库来简化无锁编程。

在实际应用中,应当根据具体场景选择合适的并发策略,无锁编程并非适用于所有情况。对于并发度不高或对性能要求不严格的场景,传统的基于锁的同步机制可能是更简单、更可靠的选择。

相关文章:

C++中的无锁编程

引言 在当今多核处理器普及的时代&#xff0c;并发编程已成为高性能应用程序开发的关键技术。传统的基于锁的同步机制虽然使用简单&#xff0c;但往往会带来性能瓶颈和死锁风险。无锁编程&#xff08;Lock-Free Programming&#xff09;作为一种先进的并发编程范式&#xff0c…...

【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现

目录 介绍 底层原理 握手环节详解&#xff1a; 收发数据&#xff08;加密&#xff09; Django 中配置 channels 1、注册 channels 2、在 settings.py 中添加 asgi_application 3、修改 asgi.py 文件 4、routing 5、consumers 实现 聊天室 介绍 WebSocket是一种先进的通信协议&…...

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…...

国内支持Stable Diffusion模型的平台

国内支持Stable Diffusion模型的平台 截至2025年3月&#xff0c;国内支持SD模型的平台主要包括以下六类&#xff0c;覆盖不同用户需求和技术层级&#xff1a; 一、模型分享与下载平台 Liblib.ai 描述&#xff1a;国内最大SD原创模型社区&#xff0c;提供海量基础模型、Lora…...

扣子(Coze):重构AI时代的工作流革命

文章目录 扣子&#xff08;Coze&#xff09;&#xff1a;重构AI时代的工作流革命使用Coze&#xff1a;一、工作流的本质&#xff1a;从单点智能到系统智能二、扣子工作流的技术基因三、场景化实践&#xff1a;从知识库到智能员工四、未来图景&#xff1a;AI Agent的进化之路结语…...

alloc、malloc 与 allocator:内存管理三剑客

内存管理是C语言开发者的核心能力&#xff0c;也是系统级编程的基石。 一、内存分配三剑客&#xff1a;malloc/calloc/realloc 1. malloc函数原理 int* arr (int*)malloc(5 * sizeof(int)); // 分配20字节空间&#xff08;假设int为4字节&#xff09; 从堆区分配指定字节的连…...

单细胞分析(21)——SCENIC 分析流程(singularity容器版)

SCENIC 分析流程笔记 SCENIC (Single-Cell rEgulatory Network Inference and Clustering) 是一种基于单细胞 RNA 测序数据的调控网络分析方法&#xff0c;主要用于识别调控因子&#xff08;TFs&#xff09;及其靶基因&#xff08;Regulons&#xff09;&#xff0c;并评估这些…...

亚马逊云科技Marketplace(中国区)上架专业服务产品, “云生态连接器”价值凸显

近日&#xff0c;由西云数据运营的亚马逊云科技Marketplace&#xff08;中国区&#xff09;正式支持专业服务产品。此次发布将大幅简化企业对云专业服务的采购流程&#xff0c;实现云软件从规划、部署到支持的全生命周期管理&#xff0c;同时也为合作伙伴提供了更多的销售机会。…...

拉普拉斯·隆格·楞次矢量

L − R − L L-R-L L−R−L 矢量的推导 有平方反比有心力&#xff1a; F ⃗ − k r 2 r ^ \vec F-\dfrac{k}{r^2}\hat r F −r2k​r^ 显然角动量 L ⃗ r ⃗ p ⃗ \vec L\vec r\times \vec p L r p ​ 守恒。 故 ∣ L ⃗ ∣ Const \begin{vmatrix}\vec L\end{vmatrix}\…...

GStreamer —— 2.3、Windows下Qt加载GStreamer库后运行 - “教程3:动态管道“(附:完整源码)

运行效果&#xff08;音频&#xff09; 简介 上一个教程演示了GStreamer 概念。本教程中的管在它设置为 playing 状态之前完全构建。这没关系。如果 我们没有采取进一步的行动&#xff0c;数据会到达 pipeline 的 pipeline 和 pipeline 将生成错误消息并停止。但 我们将采取进一…...

jupyter notebook更改文件存储路径

默认情况打开是这样的 进入cmd或者Anaconda Prompt&#xff0c;输入以下命令 jupyter notebook --generate-config进入该目录 打开该文件&#xff0c;CTRLF 查找c.ServerApp.root_dir 进行修改。 这样就修改好啦&#xff01;...

基于遗传算法的无人机三维路径规划仿真步骤详解

基于遗传算法的无人机三维路径规划仿真步骤详解 一、问题定义 目标:在三维空间内,寻找从起点到终点的最优路径,需满足: 避障:避开所有障碍物。路径最短:总飞行距离尽可能短。平滑性:转折角度不宜过大,降低机动能耗。输入: 三维地图(含障碍物,如立方体、圆柱体)。起…...

①EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器

EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 型号 1路总线EC网关 MS-A2-1011 2路总线EC网关 MS-A2-1021 4路总线EC网关 MS-A2-1041 EtherCAT 串口网关 EtherCAT 转 RS485 技术规格 …...

Spring Boot WebFlux 中 WebSocket 生命周期解析

Spring Boot WebFlux 中的 WebSocket 提供了一种高效、异步的方式来处理客户端与服务器之间的双向通信。WebSocket 连接的生命周期包括连接建立、消息传输、连接关闭以及资源清理等过程。此外&#xff0c;为了确保 WebSocket 连接的稳定性和可靠性&#xff0c;我们可以加入重试…...

集合论之集合的表示法

目录 1. 说明 2. 常用表示法 2.1 枚举法(Roster Notation) 2.2 构建法(Set-builder notation) 3. 其它表示法 1. 说明 要表示一个集合&#xff0c;可以直接列出其元素&#xff0c;或者提供一种可以唯一地刻画其元素的方当。 2. 常用表示法 2.1 枚举法(Roster Notatio…...

【C语言】值传递与指针传递,以及 `.` 和 `->` 操作详解

在 C 语言中,函数参数的传递机制和结构体成员的访问方式是编程中的核心概念。值传递(pass-by-value)和指针传递(pass-by-pointer)决定了函数如何处理传入的数据,而 . 操作符 和 -> 操作符 则是访问结构体成员的两种主要工具。这两者密切相关,尤其在处理结构体时,它们…...

机器人训练环境isaac gym以及legged_gym项目的配置问题

完整的安装环境教程(强烈推荐):...

DeepSeek 开源周回顾「GitHub 热点速览」

上周&#xff0c;DeepSeek 发布的开源项目用一个词形容就是&#xff1a;榨干性能&#xff01;由于篇幅有限&#xff0c;这里仅列出项目名称和简介&#xff0c;感兴趣的同学可以前往 DeepSeek 的开源组织页面&#xff0c;深入探索每个项目的精彩之处&#xff01; 第一天 FlashML…...

冯 • 诺依曼体系结构

文章目录 冯 • 诺依曼体系结构的介绍冯 • 诺依曼体系结构的由来内存是如何提高冯•诺依曼体系结构效率的&#xff1f;为什么程序运行之前必须先加载到内存&#xff1f;从软件层面上再理解冯 • 诺依曼体系结构&#xff08;QQ聊天的数据流动&#xff09;一些知识的补充 冯 • …...

软考架构师笔记-存储管理

1.5 存储管理 存储管理 页式存储组织 虚地址 页号 | 页内地址页表 页号 | 块号物理地址 块号 | 页内地址访存两次&#xff1a;访问页表得到物理地址&#xff0c;根据物理地址得到数据就是把用户程序的空间分成若干页&#xff0c;把内存空间分成若干块&#xff0c;块和页的…...

【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…...

C#实现语音合成播报器——基于System.Speech的语音交互方案,在windows上实现语音播报指定文本

——基于System.Speech的语音交互方案&#xff0c;在windows上实现语音播报指定文本 一、语音合成播报应用场景 语音合成播报器广泛应用于以下领域&#xff1a; 工业控制&#xff1a;生产线异常报警、设备状态实时播报&#xff08;如网页4中的WinCC语音报警插件&#xff09;…...

【数据库】关系代数

关系代数 一、关系代数的概念二、关系代数的运算2.1 并、差、交2.2 投影、选择2.3 笛卡尔积2.4 连接2.5 重命名2.6 优先级 一、关系代数的概念 关系代数是一种抽象的数据查询语言用对关系的运算来表达查询 运算对象&#xff1a;关系运算符&#xff1a;4类运算结果&#xff1a;…...

点云滤波方法:特点、作用及使用场景

点云滤波是点云数据预处理的重要步骤&#xff0c;目的是去除噪声点、离群点等异常数据&#xff0c;平滑点云或提取特定频段特征&#xff0c;为后续的特征提取、配准、曲面重建、可视化等高阶应用打下良好基础。以下是点云中几种常见滤波方法的特点、作用及使用场景&#xff1a;…...

MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革

随着人工智能、大模型等技术的蓬勃发展&#xff0c;生成式AI应用全面爆发。在此背景下&#xff0c;服务机器人作为大模型技术在端侧落地的关键场景&#xff0c;迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备&#xff0c;服务机器人需要应对复杂场景下的感知、决策和…...

如何下载安装 PyCharm?

李升伟 整理 一、下载 PyCharm 访问官网 打开 PyCharm 官网&#xff0c;点击 "Download" 按钮25。 版本选择&#xff1a; 社区版&#xff08;Community&#xff09;&#xff1a;免费使用&#xff0c;适合个人学习和基础开发。 专业版&#xff08;Professional&#…...

STM32F407IGT的USB功能

使用STM32F407IGT的USB功能时,需注意硬件设计、协议配置、软件开发和调试等关键点。以下是分步指南和注意事项: 1. 硬件设计 USB接口选择: OTG FS(全速,12 Mbps):内置PHY,适用于简单应用(如HID、CDC)。OTG HS(高速,480 Mbps):需外接ULPI PHY芯片(如USB3300),…...

虚拟机IP配置

以下是在常见操作系统中配置虚拟机IP的一般步骤&#xff1a; 一、VMware Workstation&#xff08;Windows或Linux主机下的虚拟机&#xff09; 1. 桥接模式&#xff08;Bridged&#xff09;下的IP配置 - 在虚拟机设置中&#xff0c;将网络适配器设置为桥接模式。 - 启动虚拟机…...

机器学习-决策树详细解释

目录 一、预备知识 1.信息熵: 2.条件熵: 3.信息增益 4.基于信息增益选择分割特征的过程 5. C4.5算法 6.C435算法选择特征的策略 7 基尼不纯度: 二. 决策树的核心概念 ​1.树的结构 ​2.关键算法 三. 决策树的构建过程 1.特征选择 2.递归分割 3.停止条件 四. 决…...

kube-state-metrics镜像配置

在 Kubernetes 上部署 kube-state-metrics 时&#xff0c;镜像配置是非常重要的一步。kube-state-metrics 的官方镜像托管在 Google Container Registry (GCR) 上&#xff0c;但如果你无法直接访问 GCR&#xff0c;或者需要自定义镜像&#xff0c;可以按照以下步骤进行配置。 …...

计算机网络面试题

介绍一下Http常见的状态码 200 OK&#xff1a;最常见的成功响应码&#xff0c;表示服务器已成功处理了客户端的请求&#xff0c;请求的资源正常返回。400 Bad Request&#xff1a;表示客户端发送的请求存在语法错误或无法被服务器理解&#xff0c;如请求参数缺失、格式不正确等…...

Minix OS的配置 SSH C程序编译

Minix3的下载 官网&#xff1a;https://www.minix3.org/ 安装 平台&#xff1a;VMware 开机后进入系统使用setup命令来配置和安装尽量配置一个DNS服务器&#xff0c;比如8.8.8.8 SSH 安装&#xff1a;pkgin install openssh 修改配置文件&#xff0c;需要&#xff1a; 修…...

js的继承你了解多少

实现继承的方式有很多&#xff0c;下面我们来写常用的几种&#xff08;包括但不限于原型链继承、构造函数继承、组合继承、寄生组合继承、ES6继承&#xff09;&#xff1a; 原型链继承 原型链继承通过修改子类的原型为父类的实例&#xff0c;从而实现子类可以访问到父类构造函…...

Docker 安装与使用

一.、Ubuntu如何安装docker 1、更新apt&#xff1a; sudo apt update 2、安装依赖包 sudo apt install apt-transport-https ca-certificates curl software-properties-common 3、添加Docker的官方GPG密钥&#xff1a; curl -fsSL https://download.docker.com/linux/ubuntu/…...

基于Asp.net的零食购物商城网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

FPGA基础 -- Verilog常用关键字

Verilog 是一种硬件描述语言&#xff08;HDL&#xff09;&#xff0c;用于描述和设计数字电路。下面是 Verilog 的常用语法和关键概念&#xff1a; 1. Verilog 设计结构 Verilog 代码通常由 模块&#xff08;module&#xff09; 组成&#xff0c;每个模块表示一个硬件单元&…...

取消请求:axios.

axios.CancelToken和isCancel cancelToken的作用是获取取消函数&#xff0c;用来手动取消接口。 axios.isCancel的作用是在处理错误的时候判断当前错误&#xff0c;是否是由于取消导致的。 使用方式1 const testFun async () > {let cancel: any; // 保存取消函数// 发送…...

Element UI-Select选择器结合树形控件终极版

Element UI Select选择器控件结合树形控件实现单选和多选&#xff0c;并且通过v-model的方式实现节点的双向绑定&#xff0c;封装成vue组件&#xff0c;文件名为electricity-meter-tree.vue&#xff0c;其代码如下&#xff1a; <template><div><el-select:valu…...

粒子群优化算法(Particle Swarm Optimization, PSO)的详细讲解

一、粒子群算法(PSO)基本概念 1. 算法来源 灵感:模拟鸟群或鱼群在觅食过程中的群体协作行为。核心思想:通过个体历史最佳位置和群体全局最佳位置引导搜索方向。2. 与遗传算法的区别 特性PSOGA启发式来源群体协作(鸟类或鱼类行为)生物进化(自然选择、基因重组)解空间搜…...

小菜鸟系统学习Python-迭代实现斐波那契和汉诺塔问题

斐波那契: def fbnq(n):n1 1n2 1n3 1if n<1:print(输入错误,应该大于1)return -1while (n-2)>0:n3 n2 n1n1 n2n2 n3n-1return n3a fbnq(10) print(共有%d个兔子%a)汉诺塔: def hnt(n,x,y,z):if n1:print(x,->,z)else:hnt(n-1,x,z,y)#将前n-1个从x移到y上pri…...

轻松部署 Stable Diffusion WebUI 并实现局域网共享访问:解决 Conda Python 版本不为 3.10.6 的难题

这篇博文主要为大家讲解关于sd webui的部署问题&#xff0c;大家有什么不懂的可以随时问我&#xff0c;如果没有及时回复&#xff0c;可联系&#xff1a;1198965922 如果后续大家需要了解怎么用代码调用部署好的webui的接口&#xff0c;可以在评论区留言哦&#xff0c;博主可以…...

unity文字转语音usherpa-onnx-tts

usherpa-onnx-tts 语音识别&#xff08;语音转文本、ASR&#xff09; https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models 文本到语音转换 &#xff08;TTS&#xff09; https://github.com/k2-fsa/sherpa-onnx/releases/tag/tts-models VAD系列 https://git…...

STM32---FreeRTOS时间片调度实验

一、简介 时间片调度&#xff1a;同等优先级任务轮流地享有相同的CPU时间&#xff08;可设置&#xff09;&#xff0c;叫时间片&#xff0c;在FreeRTOS中&#xff0c;一个时间片就等于SysTick中断周期&#xff1b; 二、实验 实验设计&#xff1a; 把滴答定时器中断频率设置为…...

探秘 C 语言:编程世界的基石与传奇

一、C 语言的前世今生 C 语言诞生于 20 世纪 70 年代&#xff0c;由贝尔实验室的丹尼斯・里奇&#xff08;Dennis Ritchie&#xff09;开发。它最初是为了配合 UNIX 操作系统的开发&#xff0c;旨在提供一种高效、灵活且可移植的编程语言。在那个硬件资源有限的年代&#xff0…...

MySQL查询语句完全指南:从基础到高阶实战

一、开篇&#xff1a;为什么选择MySQL查询作为切入点&#xff1f; 根据Stack Overflow 2023开发者调查&#xff0c;MySQL以51.1%的使用率蝉联最受欢迎数据库榜首。其查询语句作为数据操作的基石&#xff0c;支撑着全球数百万应用的日常运转。本指南将通过2000字详解和30个实战…...

AJAX 数据库

AJAX 数据库 引言 随着互联网技术的飞速发展,前端与后端之间的交互需求日益增长。AJAX(Asynchronous JavaScript and XML)作为一种强大的技术,在实现这种交互中发挥着关键作用。本文将深入探讨AJAX技术与数据库的融合,分析其在现代Web开发中的应用及其优势。 AJAX简介 …...

正则表达式梳理(基于python)

正则表达式&#xff08;regular expression&#xff09;是一种针对字符串匹配查找所定义的规则模式&#xff0c;独立于语言&#xff0c;但不同语言在实现上也会存在一些细微差别&#xff0c;下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…...

Python项目-基于深度学习的校园人脸识别考勤系统

引言 随着人工智能技术的快速发展&#xff0c;深度学习在计算机视觉领域的应用日益广泛。人脸识别作为其中的一个重要分支&#xff0c;已经在安防、金融、教育等多个领域展现出巨大的应用价值。本文将详细介绍如何使用Python和深度学习技术构建一个校园人脸识别考勤系统&#…...

在PyCharm开发环境中,如何建立hello.py文件?

李升伟 整理 一、分析 首先&#xff0c;用户可能是刚接触PyCharm或者Python的新手&#xff0c;所以需要从打开软件开始讲起。不过用户可能已经安装好了PyCharm&#xff0c;但也许需要确认是否已经正确安装。不过问题重点在创建文件&#xff0c;可能不需要深入安装步骤。 接下…...

常见的网络协议介绍

一、什么是网络协议 指的是通信双方的数据发送和接收顺序&#xff0c;数据的封装规则。 通俗解释&#xff1a;描述双方发送和接收的每个字节是按照什么规则。 二、TCP/IP体系的常用协议 (一)应用层 HTTP&#xff1a;超文本协议&#xff1b;指的是用来传输文本网页的协议&#…...