2011-11-06 wcdj
BLP 4th P.416
类UNIX操作系统早就具备了多进程的功能了,但有时人们认为,用fork调用来创建新进程的代价太高。在这种情况下,如果能让一个进程同时做两件事情或至少看起来是这样将会非常有用。而且,你可能希望能有两件或更多的事情以一种非常紧密的方式同时发生。这就是需要线程发挥作用的时候了。
知识点:
(1) 在进程中创建新线程。
pthread_create 函数
pthread_exit 函数
pthread_join 函数
(2) 在一个进程中同步线程之间的数据访问。
(3) 修改线程的属性。
(4) 在同一个进程中,从一个线程中控制另一个线程。
1 什么是线程
在一个程序中的多个执行路线就叫做线程(thread)。更准确的定义是:线程是一个进程内部的一个控制序列。虽然Linux和许多其他的操作系统一样,都擅长同时运行多个进程,但迄今为止我们看到的所有程序在执行时都是作为一个单独进程。事实上,所有的进程都至少有一个执行线程。
注意:
弄清楚fork系统调用和创建新线程之间的区别非常重要。
(1) 当进程执行fork调用时,将创建出该进程的一份新副本。这个新进程拥有自己的变量和自己的PID,它的时间调度也是独立的,它的执行(通常)几乎完全独立于父进程。
(2) 当在进程中创建一个新线程时,新的执行线程将拥有自己的栈(因此,也有自己的局部变量),但与它的创建者共享全局变量、文件描述符、信号处理函数和当前目录状态。
现在,多核处理器已非常普遍,大多数机器在底层硬件上就已物理支持了同时执行多个线程。而此前,对于单核CPU来说,线程的同时执行只是一个聪明、但非常有效的幻觉。
Linux在1996年第一次获得线程的支持,我们常把当时使用的函数库称为LinuxThread。LinuxThread已经和POSIX的标准非常接近了(事实上,从许多方面来看,它们之前的区别并不明显),它使Linux程序员第一次可以在Linux系统中使用线程。但是,在Linux的线程实现版本中和POSIX标准之间还是存在着细微的差别,最明显的是关于信号处理部分。这些差别中的大部分都受底层Linux内核的限制,而不是函数库实现所强加的。
NPTL(Native POSIX Thread Library, Linux上的本地POSIX线程库)将成为Linux线程的新标准。第一个NPT