《Go并发编程实战》系列二:多线程编程
Go并发编程模型在低层是由操作系统所提供的线程库支撑的。
线程
线程可视为进程中的控制流,一个进程至少会包含一个线程。一个进程可以包含多个线程。拥有多个线程的进程可以并发执行多个任务,并且及时某个或某些任务被阻塞,也不会影响其他任务正常执行。
一个进程中的所有线程都拥有自己的线程栈,并以此存放自己的私有数据。这些线程的线程栈都包含在其所属进程的虚拟内存地址中。一个进程的很多资源都会被其中的所有线程共享,被共享的资源包括在当前进程的虚拟内存地址中存储的代码段、数据段、堆、信号处理函数,以及当前进程所持的文件描述符,等等。
线程的标识
每个线程也都有属于自己的ID,这类ID也称为线程ID或者TID,线程ID只在其所属进程的范围内唯一。
线程ID是有操作系统内核分配和维护的。
线程的控制
与进程不同的是同一个进程中的任意两个线程之间的关系都是平等的,之间并不存在层级关系。任何线程都可以对统一进程中的其他线程进行有限的管理。
主要包括以下四种:
- 创建线程
- 终止线程
- 连接已终止的线程
- 分离线程
线程也可对自身进行两种控制:终止(return)和分离(pthread_detach)
线程的状态
线程在从创建到终止的完整生命周期中也经常会在多个状态之间切换。(就绪状态->运行状态->睡眠状态,僵尸状态,终止状态)