用fork调用来创建新进程的代价太高,在这种情况下,如果能让一个进程同时做两件事情或至少看起来是这样,将会非常有用。而且,你可能希望能有两件或更多的事情以一种非常紧密的方式同时发生。————————需要线程。
fork新进程时,新进程几乎完全独立。拥有自己的变量和自己的PID,它的时间调度也是独立的。
而创建新线程时,新的执行线程将拥有自己的栈(因此也有自己的局部变量),但与它的创建者共享全局变量、文件描述符、信号处理函数和当前目录状态。
单核CPU,线程的同时执行只是一个聪明、但非常有效地幻觉。多核处理器在底层硬件上就已物理支持了同时执行多个线程。
!问题:什么时候适用多进程?什么时候适用多线程?
在多线程程序中,因时序上的细微偏差或无意造成的变量共享而引发错误的可能性是很大的。
为了适用线程函数库调用,我们必须定义宏 _REENTRANT,在程序中包含头文件 pthread.h, 并且在编译程序时需要用选项 -lpthread 来链接线程库。
可重入代码,可以被多次调用而仍然正常工作,这些调用可以来自不同的例程,也可以是某种形式的嵌套调用。因此,代码中的可重入部分通常只使用局部变量,这使得每次对该代码的调用都将获得它自己的唯一的一份数据副本。
_REENTRANT 的定义必须位于程序中的任何 #include 语句之前。