线程——恐吓或威胁
尽管unix开发者早就习惯于通过多个协作进程进行计算,他们仍然没有使用线程的自发传统。线程最近才从其它地方移植过来,而unix开发者不喜欢线程这件事,决不仅仅是意外或历史的偶然。
从复杂度控制的角度看,相对拥有独立地址空间的轻量级进程,线程是个糟糕的替代:线程是那些进程生成昂贵、IPC功能薄弱的操作系统所特有的概念。
从定义上看,尽管进程的子线程通常具有独立的局部变量栈,它们却共享同一全局内存。在这个共享地址空间管理竞争和临界区的任务相当困难,而且成为整体复杂度和滋生bug的温床。可以这样去做,但随着锁定机制复杂度的增加,意外交互作用所造成的竞争和死锁机会也相应增加。
线程成为滋生bug的温床源于它们太容易知道过多彼此的内部状态。与有着独立地址空间、必须通过明确IPC进行通信的进程不同,线程没有自动封装。这样,基于线程的程序不仅产生普通的竞争问题,而且产生了新一类bug:时序依赖,要重现这些问题都极其困难,遑论修复。
线程开发者已经觉察到这个问题。最近的线程实现和标准则体现了对提供线程本地存储的更多关注,其目的是限制共享全局地址空间所产生的问题。随着线程API朝这个方向发展,线程编程开始越来越像是对共享内存的有约束应用了。
线程常常阻碍了抽象。为了防止死锁,经常必须了解所使用的库是否使用和如何使用线程,以避免死锁问题。类似地,在程序库中使用线程还可能受到应用层使用线程的影响。——Davie Korn