一、线程概念
1、引入
我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,本篇我们将学习如何在一个进程的地址空间中执行多个线程。有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件, 一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件, 等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另外一个线程负责和一个网络主机通信。
2、什么叫线程
在一个程序里的多个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的一个控制序列”。典型的unix进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程以后,在程序设计时可以把进程设计成在同一时刻能够做不止一件事,每个线程处理各只独立的任务。线程可以看作是轻量级进程,它是操作系统调度的基本单位。main函数和信号处理函数是同一个进程地址空间中的多个控制流程,多线程也是如此,但是比信号处理函数更加灵活,信号处理函数的控制流程只是在信号递达时产生,在 处理完信号之后就结束,而多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在多个进程之间调度和切换一样。
3、线程特性
同一进程的多个线程共享同一地址空间。其中Text Segment、 Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:(1)线件描述符表;(2)每种信号的处理方式(SIG_IGN、 SIG_DFL或者自定义的信号处理函数);(3)当前工作目录;(4)用户id和组id。但有些资源是每个线程独有一分的:(1)线程id;(2)上下文,包括各种寄存器的值、程序计数器和栈指针;(3)栈空间;(4) errno变量;(5)信号屏蔽字;(6)调度优先级。
4、线程的优缺点
优点:(1)通过为每种事件类型的处理分配单独的线程,能够简化处理异步时间的代码;
(2)多个线程可以自动共享相同的存储地址空间和文件描述符;
(3)有些问题可以通过将其分解从而改善整个程序的吞吐量;
&n