并发编程的 15 条建议(译)

源代码管理的新15条建议 建议之1:使用好的配置管理工具,也称为版本控制工具(Version Control), 比如Git,SVN。 建议之2:抛弃古老的配置管理三库做法,常说的三库是指开发库(动态库)、受控库和产品库(静态库);做法是开发库->受控库->产品库。 在当年没有强大版本控制工具的“古代”,三库做法是不得不的选择,而在现代版本控制工具(比如CVS,SVN,Git等)的支持下,三库做法变得落伍了。 建议之3:纳入配置管理的文件的名称里不要含有版本号。 阅读详情

内核专家 Bryan Cantrill 和 Jeff Bonwick 在 2008 年 9 月的《ACM Queue》上发表了《Real-world Concurrency》 一文,提出了 15 条并发编程的建议,这里简单摘录如下。

1. Know your cold paths from your hot paths. 弄清楚代码里的热门执行路径和冷门执行路径。

对冷门路径,用粗粒度的锁即可。对热门路径——也就是那些必须高度并发才能实现所期望的高吞吐量的代码,应该更加小心,加锁的策略必须简单明了且细粒度。

2. Intuition is frequently wrong—be data intensive. 直觉常常是错的,要靠数据说话。

【陈硕】比如线程切换到底有多大开销,普通 mutex 加锁到底有多大代价,系统调用的开销如何,gettimeofday() 在 x86-64 Linux 是不是真的系统调用等等,都要靠数据说话。

3. Know when—and when not—to break up a lock. 知道什么时候把一个锁拆成多个,并知道什么时候不必这样做。

除了把全局锁拆成多个锁,另外一种常用的避免线程争用 (contention) 的办法是减少加锁的范围。比方说从共享的数据结构里移除 (remove and delete) 元素,其实 delete 这一步可以放到锁外面。

4. Be wary of readers/writer locks. 警惕读写锁。

初学者常犯的一个错误是,见到某个数据结构频繁读而很少写,那么就把 mutex 替换为 rwlock。这不见得是正确的。

【陈硕】这条深得我心,muduo thread lib 目前就没有提供读写锁的封装。另外,这一条也能鉴别另一篇关于线程争用的文章不靠谱。

5. Consider per-CPU locking. 考虑用每个 CPU 用一个锁。

6. Know when to broadcast—and when to signal. 知道什么时候用单个唤醒,什么时候用广播唤醒。

notifyAll() 通常表示状态变更,而 notify() 通常表示资源变得可用。滥用 notifyAll() 会导致惊群现象。

【陈硕】 muduo thread lib 的 ThreadPool 区分使用 notify() 和 notifyAll(),可作参考。

7. Learn to debug postmortem. 学会验尸。

【陈硕】 在程序中只使用 Scoped locking 来加锁的话,很容易从 call stack 查出死锁。参考《多线程服务器的常用编程模型》第 6 节 线程间同步。

8. Design your systems to be composable. 设计系统(s),使之能相互组合。

【陈硕】 比方说,把对对象的修改操作都挪到同一个线程,这样就不必加锁。参考 muduo 的 EventLoop::runInLoop()。

9. Don’t use a semaphore where a mutex would suffice. 如果 Mutex 就能解决问题的话,不要使用信号量 semaphore。

【陈硕】muduo thread lib 有意识地不提供信号量的封装。

10. Consider memory retiring to implement per-chain hash-table locks. 考虑用内存“退休”法来实现哈希表的按桶加锁。

11. Be aware of false sharing. 知道什么是伪共享。

跟多 CPU 的 Cache 有关,值得了解。

12. Consider using nonblocking synchronization routines to monitor contention. 考虑使用非阻塞的加锁来观察线程争用。

13. When reacquiring locks, consider using generation counts to detect state change. 在重新加锁时,考虑使用版本号来检测状态变更。

14. Use wait- and lock-free structures only if you absolutely must. 只在别无它法时才使用无锁数据结构。

15. Prepare for the thrill of victory—and the agony of defeat. 准备接受成功的喜悦和失败的痛苦。

更详细的解释请看原文。

Bryan Cantrill 是 dtrace 的主要作者,Jeff Bonwick 是 ZFS 和 Slab allocator 的发明者。

基于STM32与CAN总线的多电机协同控制系统设计与实现 本文详细介绍了基于STM32与CAN总线的多电机协同控制系统设计与实现。该系统采用分布式架构,通过CAN总线实现多节点通信,结合梯形加减速算法和同步控制策略,有效解决了工业自动化中多电机同步性差的问题。文章涵盖硬件设计、通信协议、抗干扰措施及实战调试经验,为工业应用提供高可靠性解决方案。 阅读详情

相关推荐

关于ADS重新安装失败的解决方案

ads卸载安装license被锁无法修改导致安装最后没有证书

weixin_47103290的博客 9702

Web内容安全策略浅析

前言 Web安全问题一直是前端领域一个绕不开的话题,但很多前端人员对Web的相关安全策略都只停留在面试过程中,本文主要是对上线过程中遇到的安全问题踩坑进行了一个总结,旨在对Web安全相关问题能有一个更为立体切身的体会,也希望能给大家提供一些踩坑时候的参考。 背景 XSS vs CSRF XSS XSS是Cross-site scripting的缩写,为了和Cascading Style Sheets进行区分,因而将其简写为XSS: Cross-site scripting (XSS) is a secu.

we452366的博客 607

8台 × 8卡 910B NPU之顶尖大模型选型分析

本文对比了2026年主流大语言模型在昇腾910B NPU集群上的部署方案。重点评估了GLM5、MiniMax M2.5、Kimi K2.5、DeepSeek V3.2和Qwen 3.5旗舰版等候选模型,从部署需求(显存占用)、能力表现(基准测试、多模态支持)和NPU生态适配度三个维度进行分析。结果显示DeepSeek V3.2综合表现最优:支持BF16/W8A8/INT4量化,在4TB显存环境下可实现2000+ TPS,首token延迟<100ms,且具备官方NPU支持。备选方案Qwen 3.5旗舰版

FeelTouch Labs 756

多线程中避免使用信号量

项目中遇到一个bug,因为接入了几家越狱平台:91、同步推、PP助手,在设备上安装了三个应用,启用其中任意一个,另外二个启动后无法创建发送socket消息,从而导致游戏直接死在登录那里,再次点击登录时线程才会被唤醒(无法发送的原因定位到,是因为在调用sem_post方法后无法将线程唤醒)。之后我尝试将信号量改为条件变量,就再也没有遇到那个问题了。具体改写的几个方法: sem_open/sem_i...

weixin_33699914的博客 290

深入解析BLheli电调固件与Dshot通讯协议:从原理到实践

本文深入解析了无人机动力系统的核心——BLheli电调固件与Dshot通讯协议。详细阐述了BLheli固件从经典版到BLheli_32的演进及其功能特性,并重点剖析了Dshot数字协议如何通过数据包和校验码实现更快、更准、更可靠的电机控制。文章还涵盖了双向Dshot遥测、实战配置与调参指南,帮助玩家充分释放无人机性能。

weixin_28273593的博客 436

【WRF工具】WRF Domain Wizard第一期:软件下载及安装

【WRF工具介绍】WRF Domain Wizard-确定模拟区域

WW、forever的博客 2918

并发编程最全总结

线程和线程池 线程 线程和进程的区别 进程是一个可执行的程序,是系统分配资源的基本单位。线程是进程内部相对独立的可执行单元,是任务调度的基本单位。 多线程的优缺点 优点:充分利用多核CPU的优势,提高CPU的利用率和程序运行效率 缺点:1、线程过多影响性能,CPU切换增加内存开销。2、存在线程同步和线程安全问题。3、可能会发生死锁。4、增加了开发人员的技术难度 线程有几种状态 5种状态:新建,就绪,运行,阻塞和死亡。 新建状态:new创建一个线程时,还没开始运行,就是新建状态。 就绪状

BUG指挥课堂 5862

Buck电源设计常见的一些问题(五)MOS管振荡抑制方法(三)

关于开关节点振荡的产生机制和抑制问题,总结了三种抑制方法。第一种方法是利用输入端的高频去耦电容;第二种方法是设计 RC 缓冲电路;第三种方法是优化自举电路的串联电阻。以上三种方法均通过实验加以验证,对开关节点振荡具有很好的抑制作用。应该综合同步 Buck 变换器的各项指标权衡设计。

小幽余生不加糖 1633

Libevent C++高并发网络编程

LIBEVENT:是一款事件驱动的网络开发包,由于采用C语言开发体积小巧,跨平台,速度极快.课程中讲解分析 LIBEVENT原理,跨平台编译事件1O、缓冲O处理。讲解HTTP服务端开发示例,HTTP客户端请求开发示例,最后基于 LIBEVENTT创建线程池C++框架,并用此框架完成FTP服务器的登录、目录访问、文件上传下载能功能。开发环境操作系统: windows1064位和 ubuntu18.0464位Libevent版本:2.1.8Windows开发工具:VS2017社区版ubuntu开发工具:g++make开发语言:C/C++课程亮点全称代码演示:课程中的每一行代码都会敲出来,并详解代码实际案例展示:基于LIBEVENT实现线程池和HTTP和TP服务器跨平台讲解:基于 WINDOWS、LNUX( UBUNTU18.04)平台开发移植

【人工智能】广度优先搜索(BFS)在人工智能中的应用(Python源码)

本文系统阐述了广度优先搜索(BFS)算法在人工智能领域的核心原理与应用。作为无信息搜索算法,BFS通过FIFO队列实现节点遍历,保证在无权图中的最优性。文章详细解析了BFS的伪代码实现和Python编程示例,并通过机器人路径规划案例展示了其实际应用场景。测试结果表明,BFS能有效解决包含障碍物的网格寻路问题,验证了算法在AI领域的实用价值。该研究为理解基础搜索算法及其工程应用提供了重要参考。

梦想起飞的地方 1143

高通平台WIFI学习-- WCN7851 三频 2X2 MIMO DBS HBS Wi-Fi 7介绍

WCN7851是支持Wi-Fi 7和蓝牙5.4的三频SoC芯片,具有以下核心特性:采用NSP334封装,支持2.4GHz/5GHz/6GHz三频段并发操作,最高速率达5.8Gbps;集成MU-MIMO、4096QAM调制技术,6GHz频段支持320MHz带宽;提供PCIe Gen3接口和低功耗设计,兼容多种无线标准。电气特性包括1.8V/1.2V可编程GPIO、76.8MHz时钟源要求,以及详细的射频性能参数。该芯片通过多链路操作和动态频率选择等先进功能,实现高性能无线连接。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1275

多线程-并发编程

基础知识 并发编程的优缺点为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU 的计算能力发挥到极致,性能得到提升 方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。 并发编程有什..

hero_xs的博客 1670

SAP OData 开发从入门到提高教程的目录

笔者 18 年的 SAP 技术开发生涯,对 SAP OData 服务的开发,测试,发布,部署,测试,及基于各种不同 SAP 技术实现的 OData 服务的幕后技术实现细节和使用场合,均有着深入的研究。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 7245

并发编程的 15 条建议(译) zz

<br /><br />内核专家 Bryan Cantrill 和 Jeff Bonwick 在 2008 年 9 月的《ACM Queue》上发表了《Real-world Concurrency》 一文,提出了 15 条并发编程的建议,这里简单摘录如下。<br />1. Know your cold paths from your hot paths. 弄清楚代码里的热门执行路径和冷门执行路径。<br />对冷门路径,用粗粒度的锁即可。对热门路径——也就是那些必须高度并发才能实现所期望的高吞吐量的代码,应

Neil 368

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

并发编程的15 条建议

内核专家 Bryan Cantrill 和 Jeff Bonwick 在 2008 年 9 月的《ACM Queue》上发表了《Real-world Concurrency》 一文,提出了 15 条并发编程的建议,这里简单摘录如下。1. Know your cold paths from your hot paths. 弄清楚代码里的热门执行路径和冷门执行路径。对冷门路径,用粗粒度的锁即可。对热门路径——也就是那些必须高度并发才能实现所期望的高吞吐量的代码,应该更加小心,加锁的策略必须简单明了且细粒度。2.

I will work my left life for my family 1616

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

并发编程的 15 条建议

内核专家 Bryan Cantrill 和 Jeff Bonwick 在 2008 年 9 月的《ACM Queue》上发表了《Real-world Concurrency》 一文,提出了 15 条并发编程的建议,这里简单摘录如下。注:Bryan Cantrill 是 dtrace 的主要作者,Jeff Bonwick 是 ZFS 和 Slab allocator 的发明者。 1. ...

lylhelin的专栏 139

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

企业部署RPA必须考虑的15条建议

如何在提高生产力的同时降低成本,是企业在深入发展中所面临的挑战。 RPA(机器人流程自动化)可帮助企业提高业务流程效率,节约生产成本,实现创新发展。 RPA依据预先设定的程序,由软件机器人代替人工执行大批量、可重复性的操作任务,以实现流程自动化。企业无需为此改变原有IT架构或重新设计基本流程。 尽管如此,RPA的部署与实施也并非一蹴而就。仓促实施可能会给企业带来更多问题,甚至导致部署失败。 为了高效、成功地实施RPA,最大限度发挥其功效,企业在规划RPA部署时,应该着重考虑以下1..

qq_42573109的博客 580

给一时兴起想要学网络安全的同学的15条建议

网上到处是「29元成为黑客大神」,朋友圈广告下面全是「求教程」的评论,连小学生都在学Kali Linux,渗透测试都从娃娃抓起了…有时候我挺纳闷,真有这么多人学黑客?但最近看到我身边一个连钓鱼邮件都点在折腾BurpSuite了,我悟了,是时候展开聊聊了!一个小白从零学安全,往往是头铁又懵圈的。说来惭愧,我现在工作也搞安全,属于小白里胡子最长的那一撮。作为一名老菜鸟,今天就跟大伙唠点实在的!萌新可以避坑,大佬请无情嘲笑,没入坑的当看个热闹。报班前先想明白:你学安全图个啥?

ice_99的博客 2361
上一篇: 击鼓传花:对比 muduo 与 libevent2 的事件处理效率
下一篇: 分布式系统的工程化开发方法
陈硕
博客等级 码龄26年 1万+粉丝 144原创
评论 49
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值