拥有梦想是一种智力,实现梦想是一种能力。
线程&进程
通常线程指的是共享相同地址空间的多个任务,每个任务是一个线程,而这种多线程的机制构成一个进程。普通进程只有一个线程,那就是main()函数的执行;而多线程进程可以有多个线程,main()是主线程,其他是子线程。
进程
- 进程有独立的地址空间
- Linux为每个进程创建task_struct
- 每个进程都参与内核调度,互不影响
线程
- 进程在切换时系统开销大
- 很多操作系统引入了轻量级进程LWP
- 同一进程中的线程共享相同地址空间
- Linux不区分进程、线程
比如,我们要实现同样一个服务,使用多线程要比多进程好得多。多线程大大提高了任务切换的效率,避免了额外的TLB & cache的刷新。
多线程共享资源和私有资源
一个进程中的多个线程共享以下资源
- 可执行的指令
- 静态数据
- 进程中打开的文件描述符
- 当前工作目录
- 用户ID
- 用户组ID
每个线程私有的资源包括
- 线程ID (TID)
- PC(程序计数器)和相关寄存器
- 堆栈
- 错误号 (errno)
- 优先级
- 执行状态和属性
线程操作
通过pthread线程库,我们可以创建线程、回收线程、结束线程
和进程的使用类似,在主线程中通过pthread_create创建一个子线程,在线程内容执行完通过pthread_exit()结束线程,子线程结束后调用pthread_join来回收线程。
线程创建 – pthread_create
#include <pthread.h>
int pthread_create(pthread_t *thread, const
pthread_attr_t *attr, void *(*routine)(void *), void *arg);
- 成功返回0,失败时返回错误码
- thread 线程对象
- attr 线程属性,NULL代表默认属性
- routine 线程执行的函数
- arg 传递给routine的参数
线程结束 – pthread_exit
#include <pthread.h>
void pthread_exit(void *retval);
- 结束当前线程
- retval可被其他线程通过pthread_join获取
- 线程私有资源被释放
线程回收 – pthread_join
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
- 成功返回0,失败时返回错误码
- thread 要回收的线程对象
- 调用线程阻塞直到thread结束
- *retval 接收线程thread的返回值