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

【C/C++】多线程竞争与线程池

多线程竞争与线程池

学习代码:threads/threads.cthreads/threads_pool.c

多线程最容易迷惑人的地方是:代码看起来是一行,CPU 执行时可能是多步。count++在 C 代码里只有一行,但底层大致要经历读取、加一、写回三个步骤。如果两个线程同时读取到旧值 50,各自加一后都写回 51,最后结果就是 51,而不是预期的 52。这就是临界区竞争。

项目里为了比较不同同步方式,写了互斥锁、自旋锁、原子操作和 CAS。CAS 的代码如下:

voidcas_inc(int*cas_count){while(1){intold=*cas_count;intnew_value=old+1;if(__sync_bool_compare_and_swap(cas_count,old,new_value)){return;}}}

CAS 的思想是乐观的:先读旧值,计算新值,提交时让 CPU 判断当前值是否仍等于旧值。如果没人改过,就交换成功;如果被其他线程改过,就继续重试。它避免了阻塞,但在竞争特别激烈时会反复失败,CPU 时间会花在重试上。所以同步方案没有绝对最好,只有适用场景:临界区短可以考虑自旋或原子操作,临界区长更适合互斥锁,简单计数优先用原子操作,复杂共享结构通常需要锁保护。

线程池则解决另一个问题:不能因为有很多任务就无限创建线程。项目里的线程池由任务队列、worker 队列、互斥锁和条件变量组成:

typedefstructnManager{structnWorker*worker_head;structnTask*task_head;pthread_mutex_tmutex;pthread_cond_tcond;}ThreadPool;

添加任务时,把任务插入队列并pthread_cond_signal()通知 worker;worker 没任务时在条件变量上等待,有任务时取出任务执行:

while(pool->task_head==NULL){if(worker->terminate)break;pthread_cond_wait(&pool->cond,&pool->mutex);}

我的理解是,多线程编程要同时考虑正确性和资源管理。锁、CAS 解决的是共享数据正确性;线程池解决的是线程数量和任务调度。只知道创建线程,程序很容易在线程数量上失控;只知道加锁,又可能把并发性能锁没了。真正的并发设计,是在安全、性能和复杂度之间找到平衡。

学习链接: https://github.com/0voice

http://www.jsqmd.com/news/1082285/

相关文章:

  • MuleSoft企业级AI集成:打通LLM与SAP/Workday等核心系统的实战指南
  • 电信网关配置管理系统命令注入漏洞深度剖析与实战复现
  • 全套DFM审查流程与八大高频专属禁忌
  • 国产贴片机如何在中小批量SMT产线中找到“超车弯道”?
  • TVA在物理AI领域的决定性意义(3)
  • 【VMware vs VirtualBox终极选型指南】:20年虚拟化专家亲测的5大核心维度对比,90%开发者都选错了!
  • 5大技术方案深度解析:fanqienovel-downloader如何重构数字阅读体验
  • 磐创科技工业协议转换器介绍
  • 如何快速实现九大网盘高速下载?LinkSwift直链助手完整指南
  • 线上怎么办理出生证翻译件?办理出生证翻译件的流程是什么?
  • DLSS Swapper技术深度解析:游戏超采样版本管理的架构设计与实现
  • 如何永久保存微信聊天记录?这款开源神器让你的对话永不丢失
  • CVE-2024-27198漏洞深度剖析:从路径遍历到CI/CD供应链攻击
  • Awesome Claude Skills:一份收录 300 多个 Claude Code 技能的清单
  • RAG 工程深入:从分块到混合检索的完整链路(附 15 道高频题)
  • VMware虚拟机导出OVF失败?92%的工程师都忽略的7个关键校验点(附诊断清单)
  • 二、Claude Code 核心配置详解:settings.json 与三层记忆体系
  • 【TEE从入门到精通及实战】57 跨Enclave密钥同步:当SGX遇上分布式一致性
  • 别再无脑让AI写代码了!2026实测:90%开发者都踩坑的AI编码误区
  • 网盘下载卡成PPT?这款开源神器让你体验飞一般的感觉!
  • ExtractorSharp游戏资源编辑器:从零开始制作DNF补丁的完整指南
  • PostgreSQL高可用基础:一主一从流复制架构部署指南
  • telnet命令
  • Ansible批量部署Nginx:从主机清单到Playbook自动化执行
  • ROFL播放器终极指南:英雄联盟回放分析利器
  • 从割裂到共生:区块链与游戏的深度融合之路
  • CVE-2025-49596漏洞剖析:从MCP Inspector未授权访问到RCE的攻防实战
  • ExifToolGui完整指南:从元数据管理到批量处理的终极解决方案
  • STM32单片机指纹开锁签到考勤系统127-3(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • VMware OVF导出全链路解析:从vSphere 7.0到8.0U3,6类报错代码级溯源与秒级修复