本文翻译自POSIX Threads Programming,原作者是:Blaise Barney, Lawrence Livermore National Laboratory
翻译缘由:某次面试面试官的问题,让我一直在思考如何高效的使用线程及其锁,思考很长一段时间没有答案,缺乏实际的负载和场景让我能够真切体会和验证。网上关于锁性能和线程的问题并不多,往往只是简单的介绍编程接口,并在假设的场景下对锁的使用进行介绍,在IBM开发者社区看到一些文章,但是也是比较浅显,没有太直接深入。偶然的机会找到这篇文章,觉得还不错,因此将它翻译出来,一是自己能够从中学习到一些东西和加深理解,另外一点顺道巩固英语(雅思囧)。
目录
- 摘要
- 线程概述
2.1 线程是什么?
2.2 Pthreas是什么?
2.3 是什么使用线程?
2.4 线程编程的设计 - Pthreads API
- 编译线程程序
- 线程管理
5.1 创建和终止线程
5.2 传递参数给线程
5.3 线程结合(Joing)和分离
摘要
在共享内存多处理器架构下,线程可以用来实现并行。硬件厂商会以他们自己私有的方式实现线程,这使得可移植性成为开发人员关心的问题。对于UNIX系统而言,IEEE POSIX 1003.1c标准将c语言线程编程接口标准化了,这个标准的具体实现就是POSIX threads或者Pthreads.
这份材料首先介绍了使用线程需要了解的概念、出发点(动机)和设计方面的考虑。然后,对于三类主要的Pthreads API例程进行了介绍:线程管理,互斥量(Mutex Variables)和条件变量(Condition Variables)。通过示例代码的演示,线程编程新手可以快速学会如何使用这些接口。这份材料包含了对LLNL细节以及MPI和线程混合编程的讨论。作为练习,许多示例代码(c语言实现)也包括在内。
适合的读者/先决条件:这份材料主要是针对那些刚刚接触并行编程的人。阅读这份材料需要对C中并行编程有个基本的了解。对于那些对并行编程并不了解的人,可以参考EC3500: Introduction to Parallel Computing。
Pthreads概览
线程是什么?
- 严格的来说,一个线程被定义为由操作系统调度的一个独立的指令流。这意味着什么?
- 对于开发人员而言,或许对线程最好的描述是:一个独立于它的主程序(main program)运行的“程序”(procedure)。
- 在深入一步,想象一下一个主程序(a.out)包含多个程序(procedures),然后这些程序可以被操作系统同时或者独立的运行,这就是对多线程程序的描述。(译者注:其实可以理解为一个程序有多条不同的执行路径在同时执行。)
- 这是怎么做到的呢?
- 在理解线程之前,首先需要理解UNIX进程。一个进程有操作系统创建,这需要一定的开销(译者注: