11.2 线程概念
典型的UNIX程序被认为是单线程控制的:每一个进程在一个时刻仅仅做一件事;引入多线程以后,我们可以在单个进程内设计程序同时执行多个任务,该方法有如下几个好处:
- 我们可以简化异步时间处理的程序的设计:对于每一种时间类型非配一个单独的线程,每一个线程都可以使用同步模型来处理事件,同步编程模型比异步编程模型更加简单。
- 多进程要实现内存和文件描述符共享需要使用操作系统提供的复杂机制,这一点将在第15章和17章中看到,相反,线程,自动便拥有了同一地址空间内的内存与文件描述符的访问权限。
- 一些程序可以被分化成为几个单独的任务,从而的提高程序的处理能力。单线程进程处理多任务的时候实际上是串行执行多任务的,因为进程内仅仅只有一个控制线程。采用多线程控制以后,独立任务的处理可以同步执行,方法是为每一个任务分配一个线程,注意,连个任务可以并行执行的条件是二者并不互相依赖。
- 类似地,交互式程序设计可以使用多线程来改善其相应速度,方法是将程序中处理用户输入与输出的程序划分为一个线程,其他任务使用其他线程实现。
有人会将多线程编程与多处理或者是多核系统联系在一起。而多线程模型的好处即使是在一台单处理器系统上也可是实现,程序设计可以通过多线程而不是多进程来简化设计,因为处理器数量并不影响程序结构。并且,只要程序在串行处理任务时需要阻塞的时候,即使是在一个单处理器机器上,你仍然可以通过多线程来改善程序的相应时间和吞吐量,因为因为一些线程被阻塞的时候,其他线程可以继续运行。
一个线程包含了必要的信息来表示进程执行的上下文环境。其中包含了一个线程ID用于表示进程内的线程,一个寄存器集合,一个堆栈,一个调度优先级以及调度策略,一个信号掩码,以及一个errno变量(1.7节),以及线程独占的数据(thread-specific data,参考12.6节)。进程内的一切都是可以在各线程之间共享,包括可执行程序,程序的全局变量以及堆内存,栈以及文件描述符。
我们即将学习的线程接口源于POSIX.1-2001。The Threads interfaces, also known as “pthreads” for “POSIX threads”,在POSIX.1-2001中是可选的,但是SUSv4将他们移到了基本要求中。对于POSIX threads的特性测试宏是_POSIX_THREADS.应用程序可以在编译时采用#ifdef来进行测试,或者在运行时使用sysconf传参_SC_THREADS常量来测试系统是否支持POSIX线程。符合SUSv4的系统都会定义标识_POSIX_THREADS,其值为200809L