博客 阅读时间 6 分钟

免费的午餐真的结束了吗?重访 Herb Sutter 的预言

分享本文
Is the Free Lunch Over? Revisiting Herb Sutter’s Prediction

早在 2005 年 3 月,Herb Sutter 就发表了他那篇著名的文章《免费的午餐已经结束》,并预言了一场与面向对象革命同样伟大的并发编程革命。下面是文章中解释这一预言动机的简短节选:

从英特尔、AMD 到 Sparc 和 PowerPC,各大处理器制造商和架构都已经用尽了大多数提升 CPU 性能的传统手段。他们不再一味推高时钟频率和直线指令吞吐量,而是大规模转向集体超线程和多核架构。这两项特性在如今的芯片上都已经具备;特别是多核,在当时的 PowerPC 和 Sparc IV 处理器上就已可用,并将于 2005 年由英特尔和 AMD 推出。事实上,2004 年 In-Stat/MDR 秋季处理器论坛的最大主题就是多核设备,许多公司展示了全新或升级版的多核处理器。回过头来看,把 2004 年称为“多核之年”一点也不夸张。

今天,我们知道摩尔定律不可能永远持续下去,正如这里

所解释的:包括戈登·摩尔本人在内的大多数半导体行业预测者预计,摩尔定律将在 2025 年左右终结。2005 年 4 月,戈登·摩尔在一次采访中表示,这种增长不可能无限期地维持下去:“它不可能永远持续。指数增长的本质就是,你不断把它向外推,最终灾难会发生。”他还指出,晶体管最终会在原子层面触及微型化的极限。

与此同时,处理器制造商在每一代新处理器中持续增加核心数量。例如,英特尔 E7 至强系列就拥有 24 个核心。

回到 Herb Sutter 的预言,他说:

并发将是我们编写软件方式的下一场重大革命。

以及

如果应用程序想充分利用持续呈指数增长的 CPU 吞吐能力,就必须越来越多地实现并发。效率和性能优化将变得更重要,而不是更不重要。

在他的预言发表十三年之后,并发真的彻底改变了我们编写软件的方式吗?还是说,我们还需要再等上几年,才能看到这场革命的到来?

我们知道,与多线程和多核系统打交道并不容易,许多开发者都遇到了重大挑战。随便浏览一下开发者论坛,就能看到这样的反馈:

I am a fairly good programmer, my boss is also a fairly good programmer. Though he seems to underestimate some tasks such as multi-threading and how difficult it can be (I find it very difficult for anything more than running a few threads, waiting for all to finish, then return results).

The moment you start having to worry about deadlocks and race conditions, I find it very difficult, but the boss doesn't seem to appreciate this - I don't think he has ever come across this. Just slap a lock on it is pretty much the attitude.

So how can I introduce him, or explain why he might be underestimating the complexities of concurrency, parallelism, and multi-threading? Or maybe I am wrong?

这正是 Herb Sutter 在他的文章中指出的:

今天绝大多数程序员并不理解并发,就像 15 年前绝大多数程序员还不理解对象一样。但并发编程模型是可以学会的,尤其是当我们坚持使用基于消息和基于锁的编程方式时;一旦理解,它并不比面向对象难多少,并有希望变得同样自然。请做好准备,并为您自己和您的团队在培训和时间上投入预留预算。

开发者们目前意识到并发的好处了吗?项目的设计是否充分利用了并发?还是说,我们仍然需要专家来设计高效的并发代码?革命已经到来了吗?

是的,革命已经到来,但它并非仅仅由开发者推动。它始于多年前的新编程语言,以及为既有语言打造的新库和新标准。开发者需要能让他们更轻松地充分利用并发的语言。仅仅依赖底层 API 通常是个坏主意,因为它可能引入大量缺陷和其他问题。

Rust、Go 和 Clojure 都是在设计之初就考虑并发的现代语言的例子。

下面是 Rust 的口号:

Rust是一门运行速度快得惊人、可防止段错误的系统编程语言,并且保证线程安全。

再来看看 Clojure 的定义:

Clojure 是一门动态的通用编程语言,将脚本语言的平易近人和交互式开发体验,与高效而健壮的多线程编程基础设施。

这些较新的语言正在赢得人气,但要与 C、C++、Java 和 C# 等老牌语言竞争仍然困难。不过,这些老牌语言多年来也增加了许多特性和库,帮助开发者利用并发、编写高效的并发代码。这正是 Herb Sutter 在他的文章中指出的:

最终,编程语言和系统将越来越被迫妥善处理并发。

例如,Microsoft® .NET Framework 4 引入了一种并行编程模型,可以利用所有可用的 CPU 核心并行运行应用程序代码,从而提升 C# 程序的性能。.NET Framework 的每个新版本都添加了让多核编程更容易的功能。

对于 C++,Herb Sutter 当时指出,它对并发完全没有标准化的支持:

C++ 语言长期以来一直被用于很好地编写重型多线程系统,但它对并发完全没有标准化的支持(ISO C++ 标准甚至不提线程——而且是故意如此),因此并发通常只能借助不可移植的、特定平台的并发特性和库来实现。(这种支持还常常不完整;例如,静态变量只能初始化一次,这通常要求编译器用锁将它们包起来,但许多 C++ 实现并不会生成这个锁。)

幸运的是,始于 2011 年的 C++ 复兴为开发者提供了许多有用的特性,让多线程和多核编程变得更加容易。

总而言之,革命已经到来——既体现在新编程语言的设计中,也体现在老牌语言新增的特性中。接下来就看开发者们如何探索这些能力并有效地运用它们了。别担心——并发编程已经不像以前那么可怕了。

归根结底,Herb Sutter 是对的——考虑到他多年来的深厚造诣,这并不令人意外。自 2011 年的 C++11 标准起,他还为许多实用并发特性的发展做出了重要贡献。

分享本文