无锁环 C实现
无锁环MPMC目标1、实现多生产者、多消费者无锁队列2、不用互斥锁3、数组循环复用4、FIFO5、不能丢消息、不能重复读、不能读到脏数据底层载体1、固定数组大小 slots[]2、capacity 必须是 2 的幂次#includestdio.h#includestdlib.h#includepthread.h#includestdatomic.h#includestring.h/* PPT无锁环关键点 1. 环形数组缓存元素定长这里用uint32_t4字节符合PPT 4字节整数倍 2. 多生产者、多消费者MPMC 3. 不加锁全部依靠原子CAS 4. 全局共享prod_head/prod_tailcons_head/cons_tail线程本地私有副本做缓存减少共享变量访问 */typedefuint32_telem_t;// 定长元素4字节和PPT要求匹配typedefstruct{atomic_uint seq;// 槽位序列号无锁同步核心elem_tdata;}slot_t;typedefstruct{slot_t*slots;size_tcapacity;// 必须是2^Nsize_tmask;// capacity‑1代替%取模// 全局共享变量所有线程可见atomic_size_tprod_head;// 生产者headatomic_size_tprod_tail;// 生产者tailatomic_size_tcons_head;// 消费者headatomic_size_tcons_tail;// 消费者tail}lockfree_ring_t;// 创建无锁环capacity必须为2的幂lockfree_ring_t*ring_create(size_tcapacity){lockfree_ring_t*rmalloc(sizeof(lockfree_ring_t));r-capacitycapacity;r-maskcapacity-1;r-slotscalloc(capacity,sizeof(slot_t));atomic_init(r-prod_head,0);atomic_init(r-prod_tail,0);atomic_init(r-cons_head,0);atomic_init(r-cons_tail,0);for(size_ti0;icapacity;i){atomic_init(r-slots[i].seq,i);}returnr;}// 销毁voidring_destroy(lockfree_ring_t*r){free(r-slots);free(r);}/** * 多生产者入队 enqueue * 返回0成功‑1队列满 */intring_enqueue(lockfree_ring_t*r,elem_tval){size_tpos,next;// 自旋CAS争抢prod_head多生产者竞争while(1){posatomic_load_explicit(r-prod_head,memory_order_relaxed);nextpos1;size_tcons_tatomic_load_explicit(r-cons_tail,memory_order_acquire);if((next-cons_t)r-capacity){return-1;// 队列满}// CAS抢占位置if(atomic_compare_exchange_weak_explicit(r-prod_head,pos,next,memory_order_relaxed,memory_order_relaxed)){break;}}size_tidxposr-mask;slot_t*sr-slots[idx];// 等待槽位空闲上一轮消费完成while(atomic_load_explicit(s-seq,memory_order_acquire)!pos){;}s-dataval;atomic_store_explicit(s-seq,pos1,memory_order_release);// 更新prod_tail推进发布指针允许其他线程看到写入while(!atomic_compare_exchange_weak_explicit(r-prod_tail,pos,next,memory_order_release,memory_order_relaxed)){posatomic_load_explicit(r-prod_tail,memory_order_relaxed);}return0;}/** * 多消费者出队 dequeue * 返回0成功‑1队空 */intring_dequeue(lockfree_ring_t*r,elem_t*out){size_tpos,next;while(1){posatomic_load_explicit(r-cons_head,memory_order_relaxed);nextpos1;size_tprod_tatomic_load_explicit(r-prod_tail,memory_order_acquire);if(posprod_t){return-1;// 队列为空}if(atomic_compare_exchange_weak_explicit(r-cons_head,pos,next,memory_order_relaxed,memory_order_relaxed)){break;}}size_tidxposr-mask;slot_t*sr-slots[idx];// 等待生产者写完数据while(atomic_load_explicit(s-seq,memory_order_acquire)!pos1){;}*outs-data;atomic_store_explicit(s-seq,posr-capacity,memory_order_release);// 更新cons_tailwhile(!atomic_compare_exchange_weak_explicit(r-cons_tail,pos,next,memory_order_release,memory_order_relaxed)){posatomic_load_explicit(r-cons_tail,memory_order_relaxed);}return0;}// 测试多生产者多消费者#defineRING_CAP(14)// 162的幂#definePRODUCER_NUM3#defineCONSUMER_NUM2#definePER_PROD_CNT20lockfree_ring_t*g_ring;/* 函数功能向无锁环里塞数据的生产者线程 *//* 入参arg 把 tid 数字本身伪装成指针值没有对应内存*//* 返回值现成结束返回值可以给 pthread_join 拿到 */void*producer_thread(void*arg){longtid(long)arg;for(inti0;iPER_PROD_CNT;i){elem_tvtid*1000i;while(ring_enqueue(g_ring,v)!0){;// 满则自旋}printf([P%ld] enqueue: %u\n,tid,v);}returnNULL;}void*consumer_thread(void*arg){longtid(long)arg;elem_tval;inttotalPER_PROD_CNT*PRODUCER_NUM;staticatomic_int recv_cnt0;while(atomic_load(recv_cnt)total){if(ring_dequeue(g_ring,val)0){atomic_fetch_add(recv_cnt,1);printf( [C%ld] dequeue: %u\n,tid,val);}}returnNULL;}intmain(void){g_ringring_create(RING_CAP);pthread_tprods[PRODUCER_NUM];pthread_tcons[CONSUMER_NUM];for(inti0;iPRODUCER_NUM;i){pthread_create(prods[i],NULL,producer_thread,(void*)(long)i);}for(inti0;iCONSUMER_NUM;i){pthread_create(cons[i],NULL,consumer_thread,(void*)(long)i);}for(inti0;iPRODUCER_NUM;i)pthread_join(prods[i],NULL);for(inti0;iCONSUMER_NUM;i)pthread_join(cons[i],NULL);ring_destroy(g_ring);printf(all done\n);return0;}给坏代码打补丁/** * 多生产者入队 enqueue * 返回0成功‑1队列满 */intring_enqueue(lockfree_ring_t*r,elem_tval){size_tpos,next;// 自旋CAS争抢prod_head多生产者竞争while(1){posatomic_load_explicit(r-prod_head,memory_order_relaxed);nextpos1;size_tcons_tatomic_load_explicit(r-cons_tail,memory_order_acquire);if((next-cons_t)r-capacity){return-1;// 队列满}// CAS抢占位置if(atomic_compare_exchange_weak_explicit(r-prod_head,pos,next,memory_order_relaxed,memory_order_relaxed)){break;}}size_tidxposr-mask;slot_t*sr-slots[idx];// 等待槽位空闲上一轮消费完成while(atomic_load_explicit(s-seq,memory_order_acquire)!pos){;}s-dataval;atomic_store_explicit(s-seq,pos1,memory_order_release);// 更新prod_tail推进发布指针允许其他线程看到写入// 以下 for 循环函数是给注释代码打补丁注释代码存在问题/*while(!atomic_compare_exchange_weak_explicit( r-prod_tail, pos, next, memory_order_release, memory_order_relaxed )){ pos atomic_load_explicit(r-prod_tail, memory_order_relaxed); }*/for(;;){size_texpectedatomic_load_explicit(r-prod_tail,memory_order_relaxed);if(expected!pos){continue;//还没轮到我等别的线程推进}size_tdesiredexpected1;if(atomic_compare_exchange_weak_explicit(r-prod_tail,expected,desired,memory_order_release,memory_order_relaxed)){break;}// CAS失败expected已经更新下一轮重新判断}return0;}

相关新闻

wordpress独立站SEO怎么做?新手必看实操指南

wordpress独立站SEO怎么做?新手必看实操指南

都清楚做外语贸易的人, 晓得独立站是归自己所有的阵地, 然而SEO就是使得访客寻觅到你的那盏照亮物件。过去好多年份我处于这个行业历经磨砺打拼, 看见许许多多的人耗费很高昂的费用构建了站点, 但却没有任何人询问此事。实际上在技术指标网站领域里边采用wordpress独立站SEO并非…

2026/8/9 12:17:39 阅读更多 →
自定义应用层协议设计与性能优化实践

自定义应用层协议设计与性能优化实践

1. 为什么需要自定义应用层协议 在网络通信中,应用层协议是应用程序之间交流的语言。当标准协议(如HTTP、FTP等)无法满足特定业务需求时,我们就需要设计自定义协议。这种情况通常出现在: 需要极致的性能优化&#xff…

2026/8/9 12:17:39 阅读更多 →
Vue+PHP构建高并发体育赛事购票系统实战

Vue+PHP构建高并发体育赛事购票系统实战

1. 项目概述 这个基于Vue和PHP的篮球足球联赛购票系统,是我去年为一个体育赛事平台开发的核心功能模块。系统前端采用Vue.js构建响应式界面,后端使用PHP处理业务逻辑,实现了从赛事展示、座位选择到支付结算的完整购票流程。特别针对体育赛事门…

2026/8/9 12:16:39 阅读更多 →

最新新闻

MiMo 2.5 Pro深度实测:无线性能、信道分析与多设备并发能力全解析

MiMo 2.5 Pro深度实测:无线性能、信道分析与多设备并发能力全解析

1. 项目概述:一次关于MiMo 2.5 Pro的深度实测最近圈子里关于MiMo 2.5 Pro的讨论热度一直没降下来,各种说法都有,有的说它性能飞跃,有的说在某些场景下表现平平。作为一个喜欢折腾和验证的从业者,我觉得与其看各种参数表…

2026/8/9 13:19:12 阅读更多 →
3分钟掌握艾尔登法环存档迁移:角色数据无损转移终极指南

3分钟掌握艾尔登法环存档迁移:角色数据无损转移终极指南

3分钟掌握艾尔登法环存档迁移:角色数据无损转移终极指南 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 还在为《艾尔登法环》存档版本不兼容而烦恼吗?EldenRingSaveCopier 这款专业的…

2026/8/9 13:19:12 阅读更多 →
Rocky Linux 9仓库配置与管理实战指南

Rocky Linux 9仓库配置与管理实战指南

1. Rocky Linux 9 仓库配置概述作为RHEL的替代发行版,Rocky Linux 9继承了企业级Linux的稳定特性。其仓库系统是软件管理的核心枢纽,直接影响系统安全性和软件生态完整性。与CentOS时代不同,Rocky的仓库策略更强调模块化设计和多版本支持&…

2026/8/9 13:19:12 阅读更多 →
Windows C/C++开发终极指南:w64devkit便携式开发环境完全解析

Windows C/C++开发终极指南:w64devkit便携式开发环境完全解析

Windows C/C开发终极指南:w64devkit便携式开发环境完全解析 【免费下载链接】w64devkit Portable C and C Development Kit for x64 (and x86) Windows 项目地址: https://gitcode.com/gh_mirrors/w6/w64devkit 还在为Windows下的C/C开发环境配置而烦恼吗&am…

2026/8/9 13:19:12 阅读更多 →
同城O2O系统开发趋势分析:本地生活数字化下的新机会

同城O2O系统开发趋势分析:本地生活数字化下的新机会

这几年,本地生活的变化很明显:过去大家只是在线上找店、领券、下单,如今更习惯用手机安排一整天的生活。早餐外卖、午休洗车、下班买菜、周末约课、临时买药,都可能在同一个城市服务网络里完成。随着即时零售、同城配送、到店服务…

2026/8/9 13:19:11 阅读更多 →
云手机多开技术解析:单卡多开、安卓虚拟化与低成本批量运营

云手机多开技术解析:单卡多开、安卓虚拟化与低成本批量运营

1. 项目概述:云手机多开背后的商业逻辑与技术本质最近不少朋友在问,有没有一种方法,能用一张手机卡,低成本地批量管理多个手机应用环境,比如同时运营多个社交媒体账号、游戏小号,或者进行应用测试。这背后指…

2026/8/9 13:18:11 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →