在前面的博文中讨论了进程的相关概念,这里重新引入一下‘线程’的概念。进程有各自独立的地址空间,所以进程间的通信是比较麻烦的,只能借助管道等才能够实现进程间通信。而linux系统中,多个线程共享进程的地址空间(也可以说是进程是一个独占资源的线程),所以线程之间的通信是非常方便的。

注:以下只针对linux系统。


★进程与线程的比较

     在linux系统中,线程和进程之间的区分不是特别明显,但是它们之间还是有一些区别的:

          (1)进程是系统资源分配的基本单位,线程是系统调度的基本单位。

          (2)每个进程都有自己独立的地址空间,而线程之间的资源是共享的。

          (3)进程间切换的系统开销较线程间切换的系统开销大。

          (4)线程也有自己的私有栈,保存一些私有资源。


★线程创建和终止

     头文件:#include <pthread.h>

     创建:   int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start_routine)(void*), void* arg);

     终止:  void pthread_exit(void* retval);

     等待:  int pthread_join(pthread_t thread, void** retval);


其中:终止线程有以下几种方法:

      ①从线程函数进行return。但是在主线程中return相当于终止整个进程。

       ②一个线程可以调用pthread_cancel终止同一进程中的另一个线程。

       ③线程可以调用pthread_exit终止自己。


例:

系统调度—‘线程’_线程

运行结果:

系统调度—‘线程’_线程_02


例:

系统调度—‘线程’_线程_03

系统调度—‘线程’_线程_04

运行结果:

系统调度—‘线程’_线程_05


★线程分离

     int pthread_detach(pthread_t thread);

     线程是可以进行分离的,线程可以分离自己,也可以分离子线程。一个分离后的线程是不能被其他线程回收的,它的资源是在它终止时由系统进行释放,但是当主线程退出后,分离的线程也将会退出,资源会由系统自动释放。


例:

系统调度—‘线程’_pthread_06

系统调度—‘线程’_pthread_07

运行结果:

系统调度—‘线程’_pthread_08