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

C++并发学习

基础学习内存序默认的memory_order_seq_cst多线程之间全局保持一致性。memory_order_acq_rel是仅次于默认的内存序是acquire和release的结合不保证所有线程看到的结果都是一致的acquire是读操作release是写操作这个不能搞混acquire的代码屏障是发生在改代码之后也就是防止后面的代码重排序到前面release的代码屏障则是发生在改代码之前前面的代码不能重排序到后面来那为什么release写入后acquire就能获取到呢CAScompare_exchange_weak和compare_exchange_strongcompare_exchange_weak可能会伪失败当存在时还可能会失败用于循环中使用compare_exchange_strong强保证单次使用为什么weak会伪失败缓存一致性协议冲突如MESI协议内存访问重排序多核间的内存屏障同步高并发编程方法总结1、精确计数案例一多个任务执行申请资源 -- 执行 -- 释放资源 申请的是同一个资源资源有两个优先级且如果资源已经申请则可以复用这里边就需要统计申请资源的次数当申请全部释放后才会去释放资源当然也可以用单例类生成类时申请资源销毁类时释放缺点就是会一直占着资源如果优先级高的话无法让别的进程申请资源使用count记录申请次数当count 0时表示资源已经申请不需要重复申请当count 0时表示释放资源enum class Priority : uint32_t { Background static_castuint32_t(OHOS::HDI::Himediacomm::CopybitPt::V1_0::MDC_USER_RS_PIC), // MDC_USER_RS_PIC 1 2, Foreground static_castuint32_t(OHOS::HDI::Himediacomm::CopybitPt::V1_0::MDC_USER_RS_VIDEO), // MDC_USER_RS_VIDEO 1 1, }; struct PriorityState { const Priority prio; int32_t channel -1; std::atomicint count{0}; std::atomicint64_t lastFailUs{0}; std::mutex mtx; explicit PriorityState(Priority p) : prio(p), channel(-1), count(0), lastFailUs(0) {} PriorityState(const PriorityState) delete; PriorityState operator(const PriorityState) delete; }; int AAECopybitManager::RequestChannel(Priority prio) { PriorityState prioStat GetState(prio); if (GetTime() - prioStat.lastFailUs.load(std::memory_order_acquire) COOL_DOWN_US) { return ERR_TIMED_OUT; } int expected prioStat.count.load(std::memory_order_relaxed); while (expected 0) { if (prioStat.count.compare_exchange_weak(expected, expected 1, std::memory_order_release, std::memory_order_relaxed)) { return OK; } } std::lock_guardstd::mutex lock(prioStat.mtx); if (prioStat.count.load(std::memory_order_relaxed) 0) { prioStat.count.fetch_add(1, std::memory_order_relaxed); return OK; } prioStat.channel aaeResource_.RequestChannelByCap(CAP, static_castuint32_t(prio)); // 申请资源 if (prioStat.channel 0) { prioStat.count.store(1, std::memory_order_release); return OK; } int64_t now GetTime(); prioStat.lastFailUs.store(now, std::memory_order_release); MHC_LOGE([ffrt_media] Request channel failed (Prio:%d, Now:%lld), static_castint(prio), now); return ERR_DEVICE_BUSY; } void AAECopybitManager::ReleaseChannel(Priority qos) { PriorityState prioStat GetState(qos); int expected prioStat.count.load(std::memory_order_relaxed); while (expected 1) { if (prioStat.count.compare_exchange_weak(expected, expected - 1, std::memory_order_release, std::memory_order_relaxed)) { return; } } std::lock_guardstd::mutex lock(prioStat.mtx); int oldCount prioStat.count.fetch_sub(1, std::memory_order_acq_rel); if (oldCount 1) { aaeResource_.ReleaseChannel(prioStat.channel); // 释放资源 return; } if (oldCount 0) { prioStat.count.store(0, std::memory_order_release); MHC_LOGE([ffrt_media] Critical Error: Unmatched ReleaseChannel call for priority %d, prioStat.prio); } }2、近似计数案例一统计流量包这里采用多个线程维护一个count只统计自己的数量如果有需要则会累加所有线程的总数。3、分区分区的意思就是对资源进行分别处理例如下面的哲学家进餐问题可以将内存均等的隔离到每个CPU上这样就不需要加锁影响其他线程的运行。就是分别进行上锁有个例子就是哲学家进餐的问题有四个哲学家可以将两个人分为一组这样的话锁的力度就会减少并发度会增加案例一复合队列实现#include iostream #include list #include mutex #include optional // 模拟侵入式链表中的数据节点 struct Node { int value; Node(int v) : value(v) {} }; class ConcurrentDeque { private: // 分段结构 struct Segment { std::listNode* data; std::mutex mtx; // 为了优化缓存行填充可以在这里添加 padding // char padding[64]; }; Segment left; Segment right; public: ConcurrentDeque() default; // 左侧入队 void push_left(Node* node) { std::lock_guardstd::mutex lock(left.mtx); left.data.push_back(node); } // 右侧入队 void push_right(Node* node) { std::lock_guardstd::mutex lock(right.mtx); right.data.push_front(node); } // 左侧出队 Node* pop_left() { std::unique_lockstd::mutex lock_l(left.mtx); if (!left.data.empty()) { return get_and_pop(left.data, true); } // 左侧为空尝试从右侧重平衡 std::unique_lockstd::mutex lock_r(right.mtx); if (right.data.empty()) return nullptr; // 重平衡将右侧数据全部搬移到左侧 left.data.splice(left.data.end(), right.data); // 搬移后从左侧取 return get_and_pop(left.data, true); } // 右侧出队 Node* pop_right() { std::unique_lockstd::mutex lock_r(right.mtx); if (!right.data.empty()) { return get_and_pop(right.data, false); } // 右侧为空遵循先左后右顺序规避死锁 lock_r.unlock(); std::unique_lockstd::mutex lock_l(left.mtx); lock_r.lock(); if (left.data.empty() right.data.empty()) return nullptr; // 如果重试发现右侧还是空且左侧有货则重平衡 if (right.data.empty() !left.data.empty()) { right.data.splice(right.data.end(), left.data); } if (right.data.empty()) return nullptr; return get_and_pop(right.data, false); } private: Node* get_and_pop(std::listNode* l, bool is_left) { Node* res is_left ? l.back() : l.front(); if (is_left) l.pop_back(); else l.pop_front(); return res; } }; int main() { ConcurrentDeque dq; dq.push_left(new Node(1)); dq.push_right(new Node(2)); if (auto n dq.pop_left()) std::cout Pop Left: n-value std::endl; if (auto n dq.pop_left()) std::cout Pop Left (rebalanced): n-value std::endl; return 0; }

相关文章:

C++并发学习

基础学习内存序默认的memory_order_seq_cst,多线程之间全局保持一致性。memory_order_acq_rel是仅次于默认的内存序,是acquire和release的结合,不保证所有线程看到的结果都是一致的acquire是读操作,release是写操作,这…...

【DeepSeek】ELF 中的PT_LOAD

在 ELF(Executable and Linkable Format)文件格式中,PT_LOAD 是程序头表中最重要的段类型。以下是对 PT_LOAD 的定义、具体包含的种类以及与其类似的其他段类型的完整解析。1. 什么是 PT_LOAD? 定义: PT_LOAD 表示一个…...

【思考模型框架】【人工智能】提示词工程:常用结构化提示词框架:BROKE

BROKE 提示词框架全解 BROKE 是由EmbraceAGI社区陈财猫提出、融合OKR目标管理逻辑的结构化提示词核心框架,是目前AI提示词工程中通用性极强、强目标导向的万能公式之一,核心解决AI输出偏差、需求模糊、结果不可量化、落地性差的核心痛点。 一、标准原版框架核心模块拆解 标…...

棉花叶子病虫害检测数据集 叶片病虫害识别图像数据集 棉花蚜虫识别 植物灰霉病与卷叶病识别

棉花计算机视觉数据集 README一、数据集核心信息项目详情类别数量及中文名称8 类(蚜虫、粘虫、细菌性枯萎病、枯萎镰刀菌、灰霉病、健康、卷叶病、叶斑病)数据数量(向下取整)5400 张图片数据集格式YOLO 格式核心应用价值1. 支撑棉…...

人工智能Ai图像识别之纸箱破损图像识别 纸箱缺陷识别 纸箱潮湿识别 纸箱状态识别图像数据集 第10336期

纸箱缺陷图像识别数据集类别 Classes (4) 类别(4) carton box 纸箱 cracked carton box 破损的纸箱 opened carton box 打开的纸箱 wet carton box 湿纸箱数据集核心信息表信息类别具体内容数据集类别包含 4 类纸箱目标:carton box&#xff0…...

铁路沿线障碍物识别数据集 铁路输电线路异物识别数据集 电线杆鸟巢识别 输电线路塑料袋检测 铁路线路气球漂浮物识别 第10217期 (1)

铁路障碍物数据集简介 p图类别Classes (4) niaochao piaofuwu qiqiu suliaodai铁路障碍物 数据集核心信息表信息类别具体内容数据集类别计算机视觉领域 - 目标检测数据集数据数量包含 2541 张图像,对应 1 个数据集数据集格式种类以图像文件形式呈现,配套…...

便携式数据处理终端工控主板怎么选?算力与功耗平衡及存储扩展指南

在户外测绘、应急指挥、现场数据分析、工业巡检、移动办公等场景中,便携式数据处理终端是实现现场海量数据实时处理、分析、存储与交互的核心专 业设备,而工控主板(又称便携数据处理终端工业主板、工业主控板、移动计算核心控制板、边缘计算嵌入式主板)作…...

SAP Smartform自定义页格式实战:SPAD配置全流程解析

1. 为什么需要自定义页格式? 在SAP项目实施过程中,打印需求往往千差万别。标准页格式可能无法满足特殊尺寸的标签打印、异形单据输出或者特定格式的商业信函需求。我遇到过不少案例:物流公司需要打印特殊尺寸的货运标签,银行需要定…...

别再只测电压了!用STM32G474的ADC玩点花的:过采样提升精度与多通道扫描实战

突破ADC性能极限:STM32G474过采样与多通道扫描实战指南 对于嵌入式开发者而言,ADC(模数转换器)就像系统的"感官神经",但大多数项目仅停留在基础电压测量层面。STM32G474系列搭载的ADC模块隐藏着令人惊艳的高…...

STM32H7 GPIO实战:用CubeMX和STM32CubeProgrammer实现LED闪烁(避坑指南)

STM32H7 GPIO实战:用CubeMX和STM32CubeProgrammer实现LED闪烁(避坑指南) 在嵌入式开发领域,STM32H7系列以其高性能和丰富的外设资源受到开发者青睐。GPIO作为最基础也最常用的外设之一,看似简单却暗藏玄机。本文将带您…...

从 Seq2Seq 到注意力:用「翻译一句话」搞懂编码器、解码器与 Query/Key/Value

本文基于序列到序列(Seq2Seq)与注意力(Attention)的核心教材内容,用日常比喻和图示把概念讲清楚。适合已经知道「神经网络」「序列」等基础词的读者。一、先问一个问题:为什么需要 Seq2Seq?传统…...

Qwen2.5-VL-7B-Instruct开发者指南:自定义提示词模板+视觉指令工程最佳实践

Qwen2.5-VL-7B-Instruct开发者指南:自定义提示词模板视觉指令工程最佳实践 你是不是也遇到过这样的问题:给一个多模态模型上传了一张图,然后问它“这是什么?”,结果它要么答非所问,要么只描述了最表面的信…...

OBS多平台直播插件完全指南:obs-multi-rtmp一键同步推流到10+平台

OBS多平台直播插件完全指南:obs-multi-rtmp一键同步推流到10平台 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 还在为每次直播只能选择一个平台而烦恼吗?obs-m…...

WorkBuddy企业级部署:权限与安全配置详解

目录 WorkBuddy架构概述部署前的准备工作权限体系设计安全配置详解审计日志配置常见问题与排查 WorkBuddy架构概述 WorkBuddy是腾讯推出的企业级AI助手,与面向个人的QClaw不同,WorkBuddy专注于企业场景,提供以下核心能力: 企业…...

BarrageGrab:构建15+平台实时直播数据采集的WebSocket直连架构

BarrageGrab:构建15平台实时直播数据采集的WebSocket直连架构 【免费下载链接】BarrageGrab 抖音快手bilibili直播弹幕wss直连,非系统代理方式,无需多开浏览器窗口 项目地址: https://gitcode.com/gh_mirrors/ba/BarrageGrab 在直播电…...

Phi-3-mini-128k-instruct长文本处理效果实测:128K上下文极限测试

Phi-3-mini-128k-instruct长文本处理效果实测:128K上下文极限测试 最近,关于大模型处理长文本的能力讨论越来越热。很多朋友都在问,那些号称能处理几十万甚至上百万字上下文的模型,实际用起来到底怎么样?是不是真的能…...

Z2kDH - Writeup by AI

Z2kDH - Writeup by AI 题目描述 这是一个基于离散对数的密钥交换协议&#xff0c;类似于 Diffie-Hellman。题目给出了以下信息&#xff1a; 模数: modulus 1 << 258 (即 2^258)生成器: g 5Alice 的公钥: 99edb8ed8892c664350acbd5d35346b9b77dedfae758190cd0544f2ea73…...

从LangChain到AgentOS:SITS2026圆桌发布的AIAgent架构成熟度评估矩阵(含6维18项量化评分标准)

第一章&#xff1a;SITS2026圆桌&#xff1a;AIAgent架构的未来方向 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026圆桌讨论中&#xff0c;来自DeepMind、Anthropic与中科院自动化所的架构师一致指出&#xff1a;下一代AI Agent将不再以“单体推理模型”为核心&…...

5分钟快速上手:MelonLoader Unity游戏模组加载器终极指南

5分钟快速上手&#xff1a;MelonLoader Unity游戏模组加载器终极指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 你是否想为…...

为什么你的Agent总在POC后消失?SITS2026成熟度模型首次定义“生产就绪阈值”——含6项硬性技术指标

第一章&#xff1a;SITS2026发布&#xff1a;AIAgent架构成熟度模型 2026奇点智能技术大会(https://ml-summit.org) 模型定位与核心价值 SITS2026正式发布的AIAgent架构成熟度模型&#xff08;AAMM&#xff09;是首个面向生产级AI Agent系统设计的分层评估框架&#xff0c;聚…...

Scroll Reverser:终极解决方案!如何让Mac触控板和鼠标实现完美滚动和谐

Scroll Reverser&#xff1a;终极解决方案&#xff01;如何让Mac触控板和鼠标实现完美滚动和谐 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否曾在MacBook触控板上享受自…...

ComfyUI-Manager依赖管理优化:从pip到uv的性能提升实战指南

ComfyUI-Manager依赖管理优化&#xff1a;从pip到uv的性能提升实战指南 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various …...

重新定义“创新“#15家创新公司

重新定义"创新" 我们熟悉的那套创新叙事&#xff0c;正在失效。 旧故事的漏洞 谈创新&#xff0c;我们习惯了讲独角兽。 讲融资、估值、10倍增长、改变世界。 讲那些从车库或者孵化器里走出来的极客英雄。 但如果你仔细看这15家公司—— 会发现一个截然不同的创新路径…...

LaTeX公式转换Word终极指南:告别复制粘贴困扰的智能解决方案

LaTeX公式转换Word终极指南&#xff1a;告别复制粘贴困扰的智能解决方案 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 还在为LaTeX公式迁移到W…...

RePKG完整指南:简单三步解锁Wallpaper Engine隐藏资源

RePKG完整指南&#xff1a;简单三步解锁Wallpaper Engine隐藏资源 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经被Wallpaper Engine中那些精美的动态壁纸深深吸引&…...

DeerFlow部署案例:高并发场景下vLLM推理服务负载均衡配置

DeerFlow部署案例&#xff1a;高并发场景下vLLM推理服务负载均衡配置 1. 引言&#xff1a;当AI研究助手遇上高并发挑战 想象一下&#xff0c;你部署了一个强大的AI研究助手&#xff0c;它能够自动搜索网络、分析数据、撰写报告&#xff0c;甚至生成播客。但当你的团队或用户量…...

AI开始用自己的语言沟通了!清华等重磅综述揭秘潜空间正抛弃人类语言

人们看着屏幕上的大模型逐字吐出文本&#xff0c;仿佛这就是它思考的过程。其实大模型的“思考”&#xff0c;是在潜空间&#xff08;Latent Space&#xff09;里完成的。大模型的前沿探索&#xff0c;正在跳出人类词汇表的限制&#xff0c;AI开始在一个看不见的多维连续空间里…...

大众点评全站数据采集终极指南:破解动态字体加密的完整爬虫方案

大众点评全站数据采集终极指南&#xff1a;破解动态字体加密的完整爬虫方案 【免费下载链接】dianping_spider 大众点评爬虫&#xff08;全站可爬&#xff0c;解决动态字体加密&#xff0c;非OCR&#xff09;。持续更新 项目地址: https://gitcode.com/gh_mirrors/di/dianpin…...

【高届数土木会议】第十届土木建筑与结构工程国际学术会议(I3CSE 2026)

第十届土木建筑与结构工程国际学术会议(I3CSE 2026) 2026 10th International Conference on Civil Construction and Structural Engineering 广东省岩土力学与工程学会、华南农业大学主办 高届数EI会议,见刊检索稳定 会议官网: 第十届土木建筑与结构工程国际学术会议(…...

如何在5分钟内掌握MediaCMS开源视频媒体管理系统的权限管理

如何在5分钟内掌握MediaCMS开源视频媒体管理系统的权限管理 【免费下载链接】mediacms MediaCMS is a modern, fully featured open source video and media CMS, written in Python/Django and React, featuring a REST API. 项目地址: https://gitcode.com/gh_mirrors/me/m…...