内核专家 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. 设计系统,使之能扩充。

【陈硕】 比方说,把对对象的修改操作都挪到同一个线程,这样就不必加锁。参考 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 的发明者。

并发编程的 15 条建议(译)相关推荐

  1. 并发编程的15 条建议

    内核专家 Bryan Cantrill 和 Jeff Bonwick 在 2008 年 9 月的<ACM Queue>上发表了<Real-world Concurrency> ...

  2. 15条建议,把技术成果写成一篇高质量学术论文

    作者:汪晟    达摩院数据库与存储实验室 引言 随着技术的不断沉淀,研发团队对通过发表学术论文向业界分享研究成果的诉求也愈发强烈.但对许多研发团队而言,论文撰写的相关问题较难把握,例如:如何评估已取 ...

  3. 从零开始学 iOS 开发的15条建议

    事情困难是事实,再困难的事还是要每天努力去做是更大的事实. 因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发.跟粉丝群的朋友交 ...

  4. Go并发编程中的那些事[译]

    原文地址:Concurrent programming 原文作者:StefanNilsson 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:kobehah ...

  5. 源代码管理的新15条建议

    作者:张克强    作者微博:张克强-敏捷307 建议之1:使用好的配置管理工具,也称为版本控制工具(Version Control), 比如Git,SVN. 请彻底抛弃 VSS,如果是新采用配置管理 ...

  6. c++ STL 工程实践的15条建议

    STL是c++非常重要的一部分,它是很多大神的杰作,高效,稳定,可扩展性好,虽然STL确实存在难以调试,内存碎片的问题(现在机器的内存越来越大,内存碎片的问题基本不太可能成为系统瓶颈,但只要你使用恰当 ...

  7. 给一时兴起想要学Python的同学的15条建议

    大家应该都有感受,近几年编程真的很火!网上到处都是9块9零基础成为编程大神,朋友圈Python广告下面乌泱泱的全是评论,连少儿都开始学编程,代码都从娃娃抓起... 有的网上课程甚至只要0.99元! 有 ...

  8. 【干货】选择外贸邮件群发软件,外贸邮件营销软件,邮件群发代发软件15条建议!

    直接干货上 邮件硬件层面: 1. 邮件群发服务器必需在海外 理由:在海外的服务器丢件少.延迟少.到达率高 2.邮件发信IP必需优质,有专门测试工具,可以测试发信IP信誉值(可以联系EmailCamel ...

  9. 从零开始学iOS开发的15条建议

    事情困难是事实,再困难的事还是要每天努力去做是更大的事实. 分三部分: 第一部分:态度和电脑 1、不要关注别人的学习经历,不要关注别人加薪经历. 因为人各不同,别人的经历极有可能并不适合你.而因为每一 ...

最新文章

  1. 不同的source control下配置DiffMerge
  2. java学习一 path与classpath
  3. Ciruy英雄谭 Chapter 2 Web浏览器如何将数据委托出去(一)
  4. Activity之间的信息传递方式
  5. 机器学习实战-回归算法-18
  6. JavaBean的get、set方法生成器
  7. Endnote生成的中英文混排参考文献中“等”与“et al”的处理
  8. 最近新学的小东西和单词
  9. ZDI 公布多个尚未修复的 Windows 高危0day详情
  10. 拖拽文件作为文件输入
  11. IEC 61850标准中ACSI映射实现研究
  12. python制作字符动画
  13. 【NOIP2015】推销员
  14. R3LIVE代码详解(一)
  15. linux kvm 时间,查看KVM虚拟机时间
  16. 计算机毕业设计之java+ssm生鲜超市进销存管理系统
  17. java毕业设计多少钱?不如自己尝试做一下
  18. CMakeLists.txt加载第三方库
  19. java 实现文件内容的加密和解密
  20. ROS学习笔记3_发布者Publisher

热门文章

  1. Docker配置国内镜像加速
  2. 详细介绍mysql-bin.000001文件的来源及处理方法
  3. 几款极好的 JavaScript 下拉列表插件
  4. jquery 与 prototype 冲突 Using jQuery with Other Libraries
  5. 集成方法(随机森林)
  6. linux实现自动远程备份(scp+ssh)
  7. 【AI视野·今日CV 计算机视觉论文速览 第156期】Mon, 9 Sep 2019
  8. SpringBoot—数据库初始化脚本配置
  9. MySQL—delete和truncate的区别
  10. Ubuntu E: 无法获得锁 /var/lib/dpkg/lock - open