201250093 谭子悦

1. 介绍

   我选择阅读的论文是 《Threads Cannot be Implemented as a Library》。

   首先,我之所以会选择阅读这篇论文,不是因为它被排在了阅读列表第一位,而是他的标题吸引了我。

   在操作系统课程的学习中,我就曾疑惑:为什么 C 语言的标准库里没有多线程 API?后来我才了解到,C 原生并不支持多线程,需要通过与平台相关的第三方库实现,比如最常见的实现接口就是 Linux 下的 POSIX Threads API,即 Pthreads。

   这篇论文则提出:多线程不能仅通过库层面来实现,而要建立语言层面的内存模型定义。

2. 文章理解

   这篇文章主要从 Pthreads 的实现思路、存在问题和性能三个角度进行了探讨。

   Pthreads 在定义语义时并没有构建形式化的内存模型,而是通过一种 “程序员友好” 的方式规定了 “使用 Pthreads 的程序不应该有对同一内存地址的并发访问”,即禁止了会导致数据竞争的使用。同时,Pthreads 还定义了若干同步函数。

   为什么这样的定义会产生问题呢?编译器在优化、编译代码时,它只了解到对同步函数有哪些操作是不可以做的(如改变顺序、缩小范围等),但在没有被同步函数包围,即不被 “锁” 保护的代码区域,它的行为是完全自由的 —— 因为编译器没有 “并发” 的概念,任何在线性执行下合理的优化都将被允许。这就导致在存在数据竞争的区域,并发执行下程序的输出结果是完全未知的。

   为了说明这些问题,文章中举了三个层层递进的案例。

3. 总结

   在操作系统、数据库等课程中,并发相关问题通常都需要用锁来解决,因此久而久之也就让我默认 “只有上锁才能解决并发问题”。而这篇论文则让我对并发问题有了新的认识:好的并发算法设计总离不来数据竞争问题,虽然可以用到这些算法的场合有限,但它们许多都和各种库的底层实现息息相关,任何性能改进都可能会对使用者带来巨大的性能提升。因此,为了实现这些算法,语言层面的多线程支持,即语言层面的内存模型语义,是必不可少的。