POSIX pthread线程库详解

本教程主要教大家在 Linux 环境中编写多线程程序,就不得不提 POSIX 标准。

POSI 是 Portable Operating System Interface 的缩写,中文译为可移植的操作系统接口;最后的字母“X”代指类 UNIX 系统。

UNIX 诞生于 20 世纪 60 年代末,是操作系统的开山鼻祖,是操作系统的发源地,后来的 Windows 和 Linux 都参考了 UNIX。类 UNIX 系统(英文 Unix-like)既包括各种传统的 UNIX 系统,比如 FreeBSD、OpenBSD、Sun Solaris 等,还包括与 UNIX 相似的系统,比如 Linux、QNX、Minix 等。

读者可以这样理解,除去 Windows,几乎你所知道的每一个系统都是 UNIX 和类 UNIX 系统,而 Linux 几乎是最著名的类 UNIX 系统。

可移植的含义是,对程序稍作修改甚至不做改动,就可以在不同的操作系统上运行。

再解释一下操作系统接口。大家都知道,操作系统负责管理计算机中的各类资源,包括内存、CPU、I/O 设备、网络连接、文件资源等。为了方便应用程序使用这些资源,操作系统提供了一系列函数(方法)供程序调用,我们习惯将这些函数(方法)统称为接口(Application Programming Interface,简称 API)。

总体上讲,POSIX 是专门为统一类 UNIX 系统接口发布的标准(规范)。这意味着,只要按照 POSIX 标准调用系统接口,编写出来的程序就能具备良好的可移植性,就可以在任何兼容 POSIX 标准的类 UNIX 系统上运行。

注意,POSIX 标准只是规定了接口的命名规范,仅此而已,并没有对各个接口的具体实现做要求。

pthread规范

从上世纪 90 年代起,POSIX 标准经过了 30 多年的更新、迭代,对文件系统、进程管理、线程管理、信号处理、网络编程等诸多方向的系统接口都做了命名规范。

在 POSIX 标准中,和多线程编程相关的这部分接口规范,我们习惯统称为 pthread(POSIX threads 的缩写)。

也就是说,pthread 和 POSIX 一样,本质上都是接口规范。pthread 是 POSIX 的子集,只包含 POSIX 标准中的一部分接口规范,这些接口全部和多线程编程有关。

平时大家提到的 pthread 库,指的就是遵循 pthread 规范的多线程库。

POSIX标准的优势

编写多线程程序,必须调用操作系统提供的接口才能实现。在实际开发中,我们通常使用一些封装好系统接口的线程库,编写程序会更加方便、灵活和高效。

注意,线程库有很多种,有些遵循 POSIX 标准,有些不遵循。

例如,早在 Linux 2.6 版本之前,使用最广泛的线程库叫做 LinuxThreads,它就不遵循 POSIX 标准。不过, 由于 LinuxThreads 线程库自身设计存在缺陷,如今已经弃用,被更强大的 NPTL 线程库替代,而 NPTL 库是遵循 POSIX 标准的。

再举个例子,C++11 标准引入了对多线程编程的支持,添加了很多用于实现多线程编程的函数(方法、类),它们的命名规范也没有严格遵循 POSIX 标准,而是采用了 C++ 自身的命名规范和语法风格。

虽然 POSIX 标准不是 Linux 多线程编程的唯一选择,但它在实际开发中得到了广泛的认可和支持。下面列举了几条 POSIX 标准的优势:
  • 跨平台:遵循 POSIX 标准编写的程序,稍作修改甚至不修改就可以在多个类 UNIX 系统中运行;
  • 标准化:POSIX 标准制定了一整套类 UNIX 系统接口的命名规范,这大大降低了初学者的学习成本,只要掌握了 POSIX 标准中接口的用法,就可以在不同的类 UNIX 系统中编写程序;
  • 成熟、稳定:POSIX 标准自上世纪 90 年代出发布,已经广泛使用了很多年,经过了大量的测试和验证,成熟性和稳定性都能得到保证;
  • 社区支持:POSIX 标准的维护是由一个开放的社区负责的,这个社区包含很多组织( IEEE 标准委员会、开源社区等)和个人,共同推动 POSIX 标准的发展。这意味着,初学者学习和使用 POSIX 标准时可以找到很多有价值的资料。

因此本教程讲解多线程编程,采用的是遵循 pthread 规范的线程库,读者安装一个遵循 POSIX 标准的类 UNIX 系统(我使用的是 Ubuntu),就可以跟随本教程学习多线程编程了。

总结

POSIX 是一套专门为统一类 UNIX 系统接口发布的标准。pthread 是 POSIX 的子类,代指那些和多线程编程相关的接口规范。

编写多线程程序,可以直接调用操作系统预留的接口实现,也可以借助线程库实现,后者在实际开发中更常见。

在类 UNIX 系统中,遵循 pthread 规范、使用最广泛的多线程库叫做 NPTL(Native POSIX Thread Library)。自 Linux 2.6 版本之后,NPTL 取代了早期的 LinuxThreads 线程库,成为 Linux 系统中默认的多线程库,本教程使用的也是 NPTL 线程库。

声明:《多线程系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。