09 线程
为什么要有线程
即便不主动创建线程,每个进程也会默认有一个主线程。
进程除了执行指令,还要管理内存、文件系统等, 线程只负责执行二进制指令。
进程并行执行的问题:
- 创建进程占用资源太多;
- 进程之间的通信需要数据在不同的内存空间传来传去,无法共享。
将前台的任务和后台的任务分开,两个任务在不同的线程处理,以保证互不耽误。
创建线程
调用 pthread_create 创建线程,第一个参数是线程对象,第二个参数是线程的属性,第三个参数是线程运行函数,第四个参数是线程运行函数的参数。调用 pthread_exit 退出线程。
线程的数据
线程栈上的本地数据
函数执行过程中的局部变量。
主线程在内存中有一个栈空间,其他线程栈也拥有独立的栈空间。
在整个进程里共享的全局数据
全局变量在一个进程中是共享的。
线程私有数据
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*))
key 一旦被创建,所有线程都可以访问,但各线程可根据自己的需要往 key 中填入不同的值,即提供了一个同名而不同值的全局变量。
数据的保护
Mutex 互斥锁
互斥(Mutual Exclusion),在共享数据访问的时候,去申请加把锁,谁先拿到锁,谁就拿到了访问权限,等访问结束把锁打开,其他人再去争夺。