多线程编程指南

多线程结构一览

传统的 UNIX 已支持多线程的概念。每个进程都包含一个线程,因此对多个进程进行编程即是对多个线程进行编程。但是,进程同时也是一个地址空间,因此创建进程会涉及到创建新的地址空间。

创建线程比创建新进程成本低,因为新创建的线程使用的是当前进程的地址空间。相对于在进程之间切换,在线程之间进行切换所需的时间更少,因为后者不包括地址空间之间的切换。

在进程内部的线程间通信很简单,因为这些线程会共享所有内容,特别是地址空间。所以,一个线程生成的数据可以立即用于其他所有线程。

在 Solaris 9 和较早的 Solaris 发行版中,支持多线程的接口是通过特定的子例程库实现的。这些子例程库包括用于 POSIX 线程的 libpthread 和用于 Solaris 线程的 libthread。多线程通过将内核级资源和用户级资源分离来提供灵活性。在当前的发行版中,对于这两组接口的多线程支持是由标准 C 库提供的。

用户级线程

线程是多线程编程中的主编程接口。线程仅在进程内部是可见的,进程内部的线程会共享诸如地址空间、打开的文件等所有进程资源。

用户级线程状态

以下状态对于每个线程是唯一的。

由于线程可共享进程指令和大多数进程数据,因此一个线程对共享数据进行的更改对进程内其他线程是可见的。一个线程需要与同一个进程内的其他线程交互时,该线程可以在不涉及操作系统的情况下进行此操作。


注 –

顾名思义,用户级线程不同于内核级线程,只有系统程序员才能处理内核级线程。由于本书面向应用程序程序员,因此将不讨论内核级线程。