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

C++ 同步原语

同步原语(Synchronization Primitives)是操作系统和编程语言提供的基本工具,用于在多线程或并发环境中协调线程(或进程)之间的执行顺序,管理共享资源的访问,以避免数据竞争(data race)、死锁(deadlock)等问题。它们是实现线程同步和互斥的核心机制,广泛应用于多线程编程中。

同步原语是底层的同步机制,用于:

1.互斥(Mutual Exclusion):确保同一时间只有一个线程访问共享资源。

2.同步(Synchronization):协调线程的执行顺序,例如等待某个条件满足后再继续。

3.通信:在线程间传递信号或数据。

C++ 的同步原语:

1.互斥锁(Mutexes)

作用:保证同一时间只有一个线程可以访问共享资源,防止数据竞争。

C++ 实现:

std::mutex(C++11):基本的互斥锁,提供独占访问。

方法:lock():获取锁(阻塞直到锁可用)。unlock():释放锁。try_lock():尝试获取锁(非阻塞)。

示例:std::lock_guard 确保每次 ++counter 是原子操作,避免数据竞争,保证 counter 最终为 2000。

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;
int counter = 0;void increment() {for (int i = 0; i < 1000; ++i) {std::lock_guard<std::mutex> lock(mtx); // RAII 自动加锁/解锁++counter;}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << counter << std::endl; // 输出 2000return 0;
}

std::recursive_mutex(C++11):允许同一线程多次锁定(递归加锁),但其他线程仍被阻塞,适合需要递归调用的场景。

方法:同 std::mutex

示例:

std::recursive_mutex rmtx;
void recursive_func(int n) {std::lock_guard<std::recursive_mutex> lock(rmtx);if (n > 0) recursive_func(n - 1);
}

std::timed_mutex(C++11):支持超时尝试加锁的互斥锁。避免无限阻塞。

额外方法:try_lock_for(), try_lock_until()

示例:

std::timed_mutex tmtx;
void try_access() {if (tmtx.try_lock_for(std::chrono::milliseconds(100))) {// 访问资源tmtx.unlock();}
}

std::recursive_timed_mutex(C++11):结合 recursive_mutextimed_mutex 的特性,支持递归加锁和超时。用于递归场景中需要超时控制。

示例:类似 timed_mutex,但允许同一线程多次加锁。

std::shared_mutex(C++17):支持读写锁,允许多个线程同时读取共享资源,但写操作独占访问,即允许多个线程共享读锁(lock_shared()),但写锁(lock())独占。适用于读多写少的场景。

方法:lock() / unlock():独占写锁。lock_shared() / unlock_shared():共享读锁。try_lock(), try_lock_shared()

示例:读写锁允许多个读者并发,但写者独占访问。

#include <shared_mutex>
#include <thread>
#include <iostream>std::shared_mutex rw_mutex;
int data = 0;void reader(int id) {std::shared_lock<std::shared_mutex> lock(rw_mutex);std::cout << "Reader " << id << " reads: " << data << std::endl;
}void writer(int id) {std::unique_lock<std::shared_mutex> lock(rw_mutex);++data;std::cout << "Writer " << id << " writes: " << data << std::endl;
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 3; ++i) {threads.emplace_back(reader, i);threads.emplace_back(writer, i);}for (auto& t : threads) {t.join();}return 0;
}

std::shared_timed_mutex(C++14):shared_mutex 的超时版本,支持超时尝试读锁或写锁。适用于读写锁需要超时控制。

额外方法:try_lock_for(), try_lock_until(), try_lock_shared_for(), try_lock_shared_until()

示例:类似 shared_mutex,但支持超时。

2.锁管理(Lock Management)

这些是 RAII 风格的工具,用于管理互斥锁的获取和释放,确保异常安全和简化代码。

std::lock_guard(C++11):RAII 封装,构造时加锁,析构时解锁,不支持手动解锁。适用于简单、轻量级的锁管理。

std::unique_lock(C++11):更灵活的 RAII 锁管理,支持手动加锁/解锁、延迟加锁、超时尝试。适用于需要灵活控制锁的场景,如条件变量。

方法:lock(), unlock(), try_lock(), try_lock_for(), try_lock_until().

示例:

std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !q.empty(); });

std::shared_lock(C++14):RAII 封装,用于管理 std::shared_mutex 的共享锁(读锁)。适合读写锁的读操作。

示例:

std::shared_lock<std::shared_mutex> lock(smtx);
// 读取共享资源

std::scoped_lock(C++17):RAII 封装,支持同时锁定多个互斥锁,避免死锁。适合需要锁定多个锁的场景。

示例:

std::mutex m1, m2;
void func() {std::scoped_lock lock(m1, m2); // 同时锁定 m1 和 m2// 访问资源
}

3.条件变量(Condition Variables)

作用:允许线程等待某个条件成立(如队列非空、任务完成),并在条件满足时被唤醒。常与互斥锁配合使用。

C++ 实现:

std::condition_variable(C++11):允许线程等待条件满足,支持通知机制。

方法:wait(lock, predicate):释放锁并等待,直到条件满足。wait_for(), wait_until(), notify_one():唤醒一个等待的线程。notify_all():唤醒所有等待的线程。

示例:生产者-消费者模型,条件变量协调生产者和消费者,确保消费者在队列非空时才处理数据。

#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>std::mutex mtx;
std::condition_variable cv;
std::queue<int> q;void producer() {for (int i = 0; i < 5; ++i) {std::lock_guard<std::mutex> lock(mtx);q.push(i);std::cout << "Produced: " << i << std::endl;cv.notify_one(); // 通知消费者}
}void consumer() {while (true) {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return !q.empty(); }); // 等待队列非空int value = q.front();q.pop();std::cout << "Consumed: " << value << std::endl;lock.unlock();if (value == 4) break; // 退出条件}
}int main() {std::thread t1(producer);std::thread t2(consumer);t1.join();t2.join();return 0;
}

std::condition_variable_any(C++11):更通用的条件变量,支持任何符合锁接口的类型(不仅限于 std::mutex)。适用于需要非标准锁类型的场景。

示例:

std::condition_variable_any cv_any;
std::unique_lock<std::shared_mutex> lock(smtx);
cv_any.wait(lock, [] { return true; });

4.原子操作(Atomic Operations)

作用:提供无锁(lock-free)的线程安全的原子操作,适合简单变量(如计数器)的并发访问。

C++ 实现:

std::atomic<T>(C++11):提供原子操作,支持基本类型(如 int, bool, pointer)和用户定义类型(需满足要求)。用于高效的计数器、标志位。

方法:load(), store(), exchange(), compare_exchange_strong(), fetch_add(), fetch_sub(), 等。

示例:std::atomic 使 counter 的递增操作原子化,解决数据竞争,性能比互斥锁更高。

#include <iostream>
#include <thread>
#include <atomic>std::atomic<int> counter = 0;void increment() {for (int i = 0; i < 1000; ++i) {counter.fetch_add(1); // 原子递增}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << counter << std::endl; // 输出 2000return 0;
}

std::atomic_flag(C++11):最轻量级的原子类型,仅支持测试和设置操作,保证无锁(lock-free)。用于简单的标志或自旋锁。

方法:test_and_set(), clear(), test() (C++20)。

示例:

std::atomic_flag flag = ATOMIC_FLAG_INIT;
while (flag.test_and_set()) {} // 自旋锁

原子内存序(Memory Ordering)(C++11):不是独立的原语,但与 std::atomic 密切相关,用于控制原子操作的内存序。用于优化性能或确保正确的同步。

类型:std::memory_order_relaxed, std::memory_order_acquire, std::memory_order_release, std::memory_order_seq_cst, 等。

示例:

std::atomic<int> x = 0;
x.store(1, std::memory_order_release);

5.信号量(Semaphores)

作用:控制有限资源的访问,或协调线程间的执行顺序。信号量是一个计数器,支持增(释放)和减(获取)操作,用于控制资源访问或线程同步。

std::counting_semaphore(C++20):支持任意计数的信号量,控制有限资源的访问。用于限制并发线程数。

方法:acquire():减少计数,阻塞如果计数为 0。release():增加计数,唤醒等待的线程。try_acquire(), try_acquire_for(), try_acquire_until()

示例:信号量限制最多 3 个线程同时运行。

#include <semaphore>
#include <thread>
#include <vector>
#include <iostream>std::counting_semaphore<3> sem(3); // 最多 3 个线程并发void task(int id) {sem.acquire();std::cout << "Task " << id << " running" << std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout << "Task " << id << " done" << std::endl;sem.release();
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 5; ++i) {threads.emplace_back(task, i);}for (auto& t : threads) {t.join();}return 0;
}

std::binary_semaphore(C++20):计数范围为 0 或 1 的信号量,相当于二进制锁。用于简单的互斥或同步。

示例:

std::binary_semaphore sem(1);
sem.acquire();
// 独占资源
sem.release();

6.屏障(Barriers)

作用:协调一组线程,使它们在某个点同步等待,直到所有线程都到达。

C++ 实现:

std::barrier(C++20):允许多个线程在到达屏障点时等待,直到所有线程到达。用于多阶段任务同步。

方法:arrive_and_wait():线程到达屏障并等待。arrive_and_drop()

示例:屏障确保所有线程完成第一阶段后才进入第二阶段。

#include <barrier>
#include <thread>
#include <iostream>std::barrier sync_point(3);void task(int id) {std::cout << "Task " << id << " phase 1" << std::endl;sync_point.arrive_and_wait();std::cout << "Task " << id << " phase 2" << std::endl;
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 3; ++i) {threads.emplace_back(task, i);}for (auto& t : threads) {t.join();}return 0;
}

7.闩锁(Latches)

闩锁是一次性屏障,等待所有线程完成特定操作。

C++ 实现:

std::latch(C++20):计数器,线程减少计数,当计数为 0 时继续。用于一次性同步(如初始化完成)。

方法:count_down(), wait(), try_wait(), arrive_and_wait()

示例:

std::latch latch(3);
void task() {// 初始化latch.count_down();
}
void main_thread() {latch.wait(); // 等待所有任务完成
}

8.其他同步工具

这些工具虽然不完全是传统意义上的同步原语,但与线程同步密切相关。

std::future / std::promise(C++11):用于异步任务的结果传递和同步,等待异步操作完成。

示例:

std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t([&p] { p.set_value(42); });
std::cout << f.get() << std::endl;
t.join();

std::async(C++11):启动异步任务,返回 std::future。用于简化异步编程。

示例:

auto f = std::async(std::launch::async, [] { return 42; });
std::cout << f.get() << std::endl;

std::thread::yield(C++11):让当前线程放弃 CPU,允许其他线程运行,用于优化忙等待。

示例:

while (!ready) {std::this_thread::yield();
}

选择哪种同步原语取决于具体场景:

简单计数器:用 std::atomic

独占访问:用 std::mutexstd::lock_guard

读多写少:用 std::shared_mutex

线程等待条件:用 std::condition_variable

限制并发:用 std::counting_semaphore

多阶段同步:用 std::barrier

多个线程互相等待对方释放锁,可能导致死锁。解决:始终按固定顺序获取多个锁,或使用 std::lock 同时获取。

锁(如 mutex)可能导致线程阻塞,降低并发性能。优先考虑无锁机制(如 std::atomic)或减少锁的粒度。

使用 RAII(如 std::lock_guard, std::unique_lock)可以确保锁在异常时释放,保证异常安全。

数据竞争和死锁难以重现时,建议使用线程分析工具(如 ThreadSanitizer)。

选择合适的同步原语需要权衡功能、性能和复杂性。

相关文章:

C++ 同步原语

同步原语&#xff08;Synchronization Primitives&#xff09;是操作系统和编程语言提供的基本工具&#xff0c;用于在多线程或并发环境中协调线程&#xff08;或进程&#xff09;之间的执行顺序&#xff0c;管理共享资源的访问&#xff0c;以避免数据竞争&#xff08;data rac…...

mmap详解

mmap详解 mmap基础概念mmap内存映射原理mmap相关函数调用mmap的使用细节mmap和常规文件操作的区别 mmap基础概念 mmap是一种内存映射文件的方法&#xff0c;即将一个文件或者其它对象映射到进程的地址空间&#xff0c;实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一…...

基于大模型底座重构司法信息系统

前置篇章&#xff1a;法律智能体所需的基础知识 构建一个高效的法律智能体&#xff0c;特别是在基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;架构的背景下&#xff0c;需要融合多种学科和领域的知识。以下是对法律智能体开发和应用所需核心基础知识的简要介…...

如何判断你的PyTorch是GPU版还是CPU版?

如何判断你的PyTorch是GPU版还是CPU版&#xff1f; PyTorch作为当前最流行的深度学习框架之一&#xff0c;支持在CPU和GPU(NVIDIA CUDA)上运行。对于深度学习开发者来说&#xff0c;正确识别PyTorch版本至关重要&#xff0c;因为GPU版本可以带来10-100倍的性能提升。本文将全面…...

Leetcode刷题记录19——无重复字符的最长子串

题源&#xff1a;https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述&#xff1a; 思路一&#xff1a; 通过两个指针&#xff0c;第一个指针指向字串的开头&#xff0c;第二…...

SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常

一、创建一个SpringBoot程序 在之前写过一篇如何创建SpringBoot程序&#xff0c;两种方式&#xff0c;方法1&#xff1a;通过maven创建SpringBoot项目 方法2&#xff1a;使用Spring Initialzr创建一个SpringBoot项目&#xff08;缺点&#xff1a;当创建项目时网络中断&#x…...

Ubuntu20.04 Ollama 配置相关

Ubuntu20.04 Ollama 配置相关 Ubuntu20.04 Ollama 配置相关ollama修改配置文件常用命令修改端口局域网访问 Ubuntu20.04 Ollama 配置相关 ollama修改配置文件常用命令 sudo gedit /etc/systemd/system/ollama.service systemctl daemon-reload systemctl restart ollama sys…...

python调用ffmpeg对截取视频片段,可批量处理

本文完全免费&#xff0c;非VIP文章&#xff0c;如果您发现需VIP可看全文&#xff0c;请邮箱联系我&#xff1a;openwebsitefoxmail.com 文章目录 python调用ffmpeg对截取视频片段&#xff0c;可批量处理用到的ffmpeg命令python调用bash指令的方法python处理代码准备函数python…...

【WLAN】华为无线AC双机热备负载分担—双链路热备份

配套实验拓扑可以下载学习交流&#xff1a;【WLAN】华为无线AC双机负载分担—双链路热备份 双链路备份的传统配置方式是在主、备AC上为AP指定对方AC的IP地址&#xff0c;并分别配置优先级&#xff0c;通过比较优先级的方式来确定主、备AC。为简化配置逻辑&#xff0c;新配置方式…...

学习笔记——《Java面向对象程序设计》-内部类、匿名类、异常类

参考教材&#xff1a; Java面向对象程序设计&#xff08;第3版&#xff09;微课视频版 清华大学出版社 1、内部类 类中可以有两种重要的成员&#xff1a;成员变量和方法。实际上Java还允许类可以有一种成员&#xff1a;内部类。 内部类可以使用其外嵌类中的成员变量&#x…...

BS架构与CS架构的对比分析:了解两种架构的不同特点与应用

目录 前言1. BS架构概述1.1 什么是BS架构&#xff1f;1.2 BS架构的主要特点 2. CS架构概述2.1 什么是CS架构&#xff1f;2.2 CS架构的主要特点 3. BS架构与CS架构的对比3.1 用户体验3.2 安全性3.3 适用场景 4. 结语 前言 在现代软件开发中&#xff0c;架构设计决定了应用的性能…...

ARM架构的微控制器总线矩阵优先级与配置

在 ARM 架构的微控制器中,总线矩阵的优先级与配置是确保多主设备(如 CPU、DMA 等)高效协同工作的关键。总线矩阵通过仲裁逻辑(Arbiter)管理主设备对共享资源的访问冲突,优先级配置直接影响系统的实时性、带宽利用率和任务响应速度。以下是总线矩阵优先级机制及配置的详细…...

高速系统设计理论基础

如前一章所述&#xff0c;在进行高速系统设计时&#xff0c;最重要的是要从基本理论出发&#xff0c;只有掌握了基本理论&#xff0c;然后才能谈到其他的设计技术和技巧。本章主要介绍微波电磁理论基础&#xff0c;及其在高速系统设计中的工程化分析方法和应用。通过对微波信号…...

Python-MCPServer开发

Python-MCPServer开发 使用FastMCP开发【SSE模式的MCPServer】&#xff0c;熟悉【McpServer编码过程】【McpServer调试方法】 1-核心知识点 1-熟悉【SSE模式的MCPServer】开发2-熟悉【stdio模式的MCPServer】开发3-熟悉【启动MCPServer】的三种方式 3.1-直接启动:python mcp_s…...

Springboot集成SSE实现消息推送+RabbitMQ解决集群环境下SSE通道跨节点事件推送问题

SSE连接介绍&#xff0c;SSE对比WebSocket Server-Sent Events (SSE) 是一种基于 HTTP 协议的轻量级实时通信技术&#xff0c;允许服务器向客户端推送数据。以下是 SSE 的主要特点&#xff1a; 单向通信&#xff1a;SSE 仅支持服务器向客户端推送数据&#xff0c;客户端不能通…...

Kettle学习

一、Kettle 简介 Kettle(现称为 Pentaho Data Integration)是一款开源ETL工具,支持从多种数据源抽取、转换和加载数据,广泛应用于数据仓库构建、数据迁移和清洗。其核心优势包括: 可视化操作:通过拖拽组件设计数据处理流程(转换和作业)。多数据源支持:数据库(MySQL/…...

科学养生,开启健康生活新方式

在快节奏的现代生活中&#xff0c;健康养生已成为人们关注的焦点。科学的养生方式不仅能增强体质&#xff0c;还能有效预防疾病&#xff0c;提升生活质量。​ 合理饮食是健康养生的基础。日常饮食应遵循均衡原则&#xff0c;保证蛋白质、碳水化合物、脂肪、维生素和矿物质的合…...

brew 安装openjdk查看其版本

使用brew&#xff08;如果你使用Homebrew安装&#xff09; 如果你通过Homebrew安装了OpenJDK&#xff0c;可以使用以下命令来查看安装的版本,&#xff1a; brew list --versions openjdk8 这将会列出所有通过Homebrew安装的OpenJDK版本及其版本号。 3. 查看/usr/libexec/ja…...

基于大模型对先天性幽门肥厚性狭窄预测及临床方案的研究报告

目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法与创新点 二、先天性幽门肥厚性狭窄概述 2.1 定义与发病机制 2.2 流行病学特征 2.3 病理与解剖特点 三、大模型预测原理及构建 3.1 大模型简介 3.2 数据收集与预处理 3.3 模型训练与优化 四、大…...

【开源】基于51单片机的温湿度检测报警系统

项目说明 该设计是一个简易的基于51单片机的温湿度检测报警系统&#xff0c;功能说明&#xff1a; 使用LCD1602实时显示当前的温湿度。读取DHT11的温湿度值&#xff0c;如果温度大于最大设定值&#xff0c;LED1亮&#xff0c;如果温度小于最小设定值&#xff0c;LED2亮。如果…...

2025年4月25日第一轮

1.作文 The increasing reliance on onlineshopping has brought both convince and challenge to consumsers.It is of great nesscity for poeple to adapt better strategies to cope with these challenges.Resons and concrete evidence to support my view are as fello…...

AutoSAR从概念到实践系列之MCAL篇(二)——Mcu模块配置及代码详解(下)

欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 上一篇内容主要为…...

A. Ideal Generator

time limit per test 1 second memory limit per test 256 megabytes We call an array aa, consisting of kk positive integers, palindromic if [a1,a2,…,ak][ak,ak−1,…,a1][a1,a2,…,ak][ak,ak−1,…,a1]. For example, the arrays [1,2,1][1,2,1] and [5,1,1,5][5,…...

微信小程序核心技术栈

微信小程序核心技术栈 WXML一.WXML基础概念1.本质与特点2.与HTML的主要差异 二.数据绑定1.基础绑定2.高级绑定模式3.数据绑定限制 三.条件渲染1.基础条件判断2.多条件渲染优化3.条件渲染性能建议 四.列表渲染1.基础列表2.进阶用法3.wx:key的深度解析 五.模版系统1.定义模版2.使…...

系统架构设计中的ATAM方法:理论、实践与深度剖析

引言 在复杂系统架构设计中,如何在性能、安全性、可维护性等质量属性之间实现平衡,是每一位资深架构师必须面对的终极挑战。传统的架构评审往往依赖经验直觉或局部优化,而‌ATAM(Architecture Tradeoff Analysis Method,架构权衡分析方法)‌通过结构化分析框架,系统性解…...

模板引擎语法-过滤器

模板引擎语法-过滤器 文章目录 模板引擎语法-过滤器[toc]1.default过滤器2.default_if_none过滤器3.length过滤器4.addslashes过滤器5.capfirst过滤器6.cut过滤器7.date过滤器8.dictsort过滤器 1.default过滤器 default过滤器用于设置默认值。default过滤器对于变量的作用&…...

关于GoWeb(1)

Go Web &#xff08;1&#xff09; 一、网络通信与 Socket 编程 &#xff08;一&#xff09;Socket 编程基础 Socket 是网络通信的核心&#xff0c;它允许程序之间通过网络进行数据交换。在 Go 中&#xff0c;可以使用标准库 net 来实现 Socket 编程。 &#xff08;二&…...

实现从一个微信小程序跳转到另一个微信小程序

前言&#xff1a; 最近在公司完成了一个两个小程序之间进行跳转的需求,将跳转方式与携带参数的方式分享给伙伴们&#xff1a; 代码展示&#xff1a; wx.navigateToMiniProgram({// 另一个程序的appIdappId: "wxbbd...",//你希望跳转到另一个小程序的目标路径&#…...

【教程】Docker运行gitlab容器

Docker运行gitlab容器 前言1.拉取gitlab镜像2.创建挂载数据卷3.运行镜像4 登录Gitalb5 访问linux的gitlab地址&#xff0c;输入用户名与密码 前言 在linux系统中安装gitlab的教程 1.拉取gitlab镜像 不指定 默认拉取最新版镜像 docker pull gitlab/gitlab-ce 2.创建挂载数据…...

微信小程序鲜花销售系统设计与实现

概述 在鲜花电商行业快速发展的背景下&#xff0c;移动端销售平台成为花店拓展业务的重要渠道。幽络源平台今日分享一款功能完善的微信小程序鲜花销售系统&#xff0c;该系统实现了多角色管理、在线订购、会员服务等核心功能&#xff0c;为鲜花行业提供了完整的电商解决方案。…...

嵌入式C设计模式---策略模式

目录 1.策略设计模式动漫详解 2.LVGL策略模式实现详解与应用 3.嵌入式中策略模式应用的优缺点 4.大话设计模式C语言实现 1.策略设计模式动漫详解 2.LVGL策略模式实现详...

打开canoe--点击capl Brower弹出错误,capl打不开

打开canoe–点击capl Brower弹出下图错误&#xff0c;capl打不开&#xff0c;友友们遇到过吗&#xff1f;怎么破&#xff1f;...

ultralytics 目标检测 混淆矩阵 背景图像 没被记录

修改 utils/metrics.py ConfusionMatrix def process_batch(self, detections, gt_bboxes, gt_cls):"""Update confusion matrix for object detection task.Args:detections (Array[N, 6] | Array[N, 7]): Detected bounding boxes and their associated inf…...

C++之map

因为前些天做了一道题&#xff1a;PTA:查询首都或国名-CSDN博客 这道题我和朋友的实现方式不同&#xff0c;想要学习学习她的这种方式&#xff0c;于是乎有了这篇研究 map 的文章。 先学习一下 map 的基本定义吧&#xff1a; map 是标准模板库&#xff08;STL&#xff09;中…...

【每天一个知识点】点乘(Dot Product)

点乘&#xff08;Dot Product&#xff09;在很多机器学习和图神经网络&#xff08;GNN&#xff09;中都有广泛应用&#xff0c;尤其在图结构重构中&#xff0c;它通常用来衡量节点之间的相似性或者关联性。让我们逐步深入理解点乘&#xff0c;尤其是在图结构重构中的应用。 1.…...

2025上海车展| 和芯星通发布覆盖车载全场景的产品方案

2025上海车展充满科技范儿&#xff0c;更加聚焦用户价值与安全性。智能化、电动化进一步深入融合&#xff0c;呈现辅助驾驶成熟量产化、舱驾融合一体化、产业链创新本土化、跨界融合生态化的趋势。 与其他辅助驾驶系统传感器相比&#xff0c;GNSS卫星定位能够提供独立于外部地…...

【Linux网络】构建HTTP响应与请求处理系统 - HttpResponse从理解到实现

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

识破养生假象,拥抱科学健康

在这个全民热衷养生的时代&#xff0c;各种养生理念与方法如潮水般涌来。但其中不少是迷惑大众的 “烟雾弹”&#xff0c;只有识破这些养生假象&#xff0c;我们才能踏上真正的健康之路。​ 不少人觉得&#xff0c;养生就得靠保健品 “撑腰”。市面上&#xff0c;各类宣称具有…...

设计一个关键字统计程序:利用HashMap存储关键字统计信息,对用户输入的关键字进行个数统计。

思路分析 首先&#xff0c;在KeywordCounter类中&#xff0c;定义了一个包含所有Java关键字的字符串数组KEYWORDS&#xff0c;用于存储所有关键字。然后创建了一个Scanner对象input&#xff0c;用于从标准输入读取用户的输入。接下来创建了一个StringBuilder对象sb&#xff0c;…...

Python文件操作及数据库交互(Python File Manipulation and Database Interaction)

Python文件操作及数据库的交互 在实际开发中&#xff0c;文件操作与数据库交互是非常常见的任务。Python作为一种高效且灵活的编程语言&#xff0c;不仅提供了丰富的文件操作功能&#xff0c;还通过多种库与数据库进行高效交互。本文将详细介绍如何使用Python进行文件操作&…...

Eigen稀疏矩阵类 (SparseMatrix)

1. SparseMatrix 核心属性与初始化 模板参数 cpp SparseMatrix<Scalar, Options, StorageIndex> Scalar&#xff1a;数据类型&#xff08;如 double, float&#xff09;。 Options&#xff1a;存储格式&#xff08;默认 ColMajor&#xff0c;可选 RowMajor&#xff0…...

【运维】Windows 与 Linux 中实时查看日志的命令对比详解(tail -f)

&#x1f50d; Windows 与 Linux 中实时查看日志的命令对比详解&#xff08;tail -f&#xff09; 在日常开发、调试、部署过程中&#xff0c;实时查看日志文件的更新内容是非常常见的需求。尤其是在排查后端服务问题、守护进程行为、系统异常等场景下&#xff0c;查看实时日志…...

巧用 Element - UI 实现图片上传按钮的智能隐藏

引言 在前端开发中&#xff0c;使用 Element - UI 组件库来构建用户界面是非常常见的操作。其中图片上传功能更是在许多项目中频繁出现&#xff0c;比如用户头像上传、商品图片上传等场景。有时候&#xff0c;我们会有这样的需求&#xff1a;当上传图片达到一定数量后&#xf…...

高级 SQL 技巧:提升数据处理能力的实用方法

在数据驱动的时代,SQL 作为操作和管理关系型数据库的标准语言,其重要性不言而喻。基础的 SQL 语句能满足日常的数据查询需求,但在处理复杂业务逻辑、进行数据分析和优化数据库性能时,就需要掌握一些高级 SQL 技巧。这些技巧不仅能提高查询效率,还能实现复杂的数据处理任务…...

2.4.5goweb项目上传到csdn的git仓库

在开始使用 Git 之前&#xff0c;你需要先安装它。不同操作系统的安装方法不同&#xff1a; (git先实战&#xff0c;能从仓库上传&#xff0c;下载之后&#xff0c;在听课程&#xff0c;记住大致流程。以后使用就知道往哪里查了) Windows&#xff1a;可以从Git 官方网站下载安…...

Eclipse 插件开发 3 菜单栏

Eclipse 插件开发 3 菜单栏 1 增加菜单2 指定位置3 点击事件4 二级菜单 (静态)5 二级菜单 (动态) 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 1 增加菜单 <?xml version"1.0&quo…...

win11右键菜单改回win10模式

win11右键菜单非常不好用&#xff0c;经常需要点击最下方的“显示更多选项”&#xff0c;下面是win11右键菜单改回win10模式的方法。 按下 Win R 组合键&#xff0c;打开“运行”窗口&#xff0c;输入 cmd&#xff0c;此时不要急着按Enter&#xff0c;按 Ctrl Shift Enter …...

SpringBoot 常用注解通俗解释

SpringBoot 常用注解通俗解释 一、启动类相关 1. SpringBootApplication • 作用&#xff1a;这是SpringBoot项目的"总开关"&#xff0c;放在主类上 • 通俗理解&#xff1a;相当于对电脑说&#xff1a;"开机&#xff01;我要用SpringBoot了&#xff01;…...

26 Arcgis软件常用工具有哪些

一、画图改图工具&#xff08;矢量编辑&#xff09;‌ ‌挪位置工具&#xff08;移动工具&#xff09;‌ 干哈的&#xff1f;‌选中要素‌&#xff08;比如地块、道路&#xff09;直接拖到新位置&#xff0c;或者用坐标‌X/Y偏移‌批量移动&#xff0c;适合“整体搬家”。 ‌磁…...

OpenCV --- 图像预处理(七)

OpenCV — 图像预处理&#xff08;七&#xff09; 文章目录 OpenCV --- 图像预处理&#xff08;七&#xff09;十七&#xff0c;图像轮廓特征查找17.1 外接矩形17.2 最小外接矩形17.3 最小外接圆 十七&#xff0c;图像轮廓特征查找 图像轮廓特征查找其实就是他的外接轮廓。应用…...