线程的优点

与使用多个进程的传统并行程序相比,多线程程序能够改善性能。 而且,使用线程的多处理器系统的性能会得到改善。

管理线程

管理线程(即创建线程并控制它们的执行)比管理进程需要系统资源少。 例如,创建线程仅需要分配线程的专用数据区(通常为 64 KB)和两个系统调用。 创建进程的代价要大的多,因为要复制整个父进程地址空间。

线程库 API 也比管理进程的库更容易使用。 创建线程仅需要 pthread_create 子例程。

线程间通信

线程间通信比使用进程间通信更有效和更容易。 因为进程中的所有线程共享相同的地址空间,他们不需要使用共享内存。 使用互斥对象或者其他同步工具保护共享数据不被并发访问。

线程库提供的同步工具易于实现灵活而强大的同步工具。 这些工具能够替换传统的进程间通信工具,例如消息队列。 管道可用作线程间通信路径。

多处理器系统

在多处理器系统上,多个线程能够并发地运行在多个 CPU 上。 因此,多线程程序运行起来比在单处理器系统上要快得多。 它们也比使用多个进程的程序快得多,因为线程需要较少的资源且生成较少的开销。 例如,在同一个进程中切换线程能更快,特别是在通常能够避免上下文切换的 M:N 库模型中。 最后,使用线程的最大优点是单个多线程程序将工作在单处理器系统上,但是可自然地利用多处理器系统而无需重新编译。

限制

多线程编程对于实现使用几个独立实体的并行算法很有用。 但是,在有些情况下,应该使用多个进程而不是多个线程。

许多操作系统标识、资源、状态或者限制是在进程级别定义的,因此被进程中的所有线程共享。 例如,用户和组标识以及它们的相关许可权在进程级别处理。 需要将不同的用户标识赋予给它们的编程实体的程序需要使用多个进程,而不是单个多线程进程。 其他示例包含文件系统属性(例如,当前工作目录)和打开的文件的状态和最大数目。 如果这些属性独立处理更好,那么多线程程序可能不适合。 例如,多进程程序能让每个进程打开大量的文件而不被其他进程干扰。