在前[Linux学习笔记9 - 进程控制开发]一文章节中,已经对进程的概念做了一定的解释。
进程是系统程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,彼此相互独立,执行过程互不干扰,但这就造成了进程在进行切换等操作时都有比较复杂的上下文切换(Context switch)等动作。线程是为了减少CPU的空转时间,支持多CPU以及减少上下文切换(Context switch)开销而演化出的。多线程中的同步是非常重要的问题。进程与线程的关系图示
User Thread)
Context switch)的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持。Lightweght Thread)
内核支持的用户线程,是内核线程的一种抽象对象。每个线程拥有一个或多个轻量级线程,而每个轻量级线程分别被绑定在一个内核线程上。Kernel Thread)
User Thread)可以对应一个或几个核心级线程(Kernel Thread),也就是“一对一”或“多对一”模型。这样既可满足多处理机系统的需要,也可以最大限度地减少调度开销,现在大多数系统都采用用户级线程与核心级线程并存的方法。pthread 线程库是一套通用的线程库,是由 POSIX 提出的,因此具有很好的可移植性。
线程创建
pthread_create()。在创建以后,就开始运行相关的线程函数,在该函数运行完之后,该线程也就退出了,这也是其退出一种方法。另一种退出线程的方法是使用函数 pthread_exit(),这是线程的主动行为。线程终止
pthread_exit()函数主动终止自身线程;pthread_cancel()函数实现在别的线程中终止另一个线程的执行。线程资源释放问题
由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,其所占用的资源并不会随着线程的终止而得到释放。正如进程之间可以用 wait()系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是pthread_join()函数,其可以用于将当前线程挂起来等待线程的结束。此函数是一个线程阻塞函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回。Attention:
exit()退出函数进行出错处理,由于其作用是使调用进程终止,往往一个进程包含多个线程,因此在使用该函数之后,该进程中的所有线程都终止了。因此,在线程中就可以使用pthread_exit()来代替进程中的exit()。参考文献:《Linux嵌入式应用程序开发标准教程》