Ch 11 线程
有利于提高程序的吞吐量,便于共享资源,交互程序可以使用多线程来改善响应时间
线程包含有:标识线程的线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据。 进程的所有信息对线程都是共享的
创建线程 pthread_create
线程创建时并不能保证哪个线程会先执行
线程终止
如果进程中的任意线程调用了 exit,_Exit,_exit,那么整个进程就会终止
3种方式退出:
- 从启动例程中返回,返回值是线程的退出码
- 线程可以被同一进程中的其他线程取消
- 线程调用 pthread_exit
调用线程将一直阻塞直到指定的线程调用 pthread_exit 或从启动例程中返回或者被取消
如果共享的变量分配在栈上,那么可能在线程退出之后的那段栈内存会被挪作他用,因此最好将共享变量设为全局变量或者使用 malloc 分配
线程可以通过 pthread_cancel 来请求取消同一进程中的其他进程,这个函数并不阻塞,而仅仅是提出请求
在派生线程中通过 pthread_cancel 取消一个进程的主线程,进程不会退出,派生线程会继续运行即便没有主线程,当最后一个线程退出的时候进程才会退出。这与进程的 main 函数返回导致进程退出进而强制终止派生线程的情况有本质区别
线程同步
一个变量的增加需要:
- 从内存单元读入寄存器
- 在寄存器中做增量操作
- 把新值写回内存
自旋锁
忙等待
互斥量
先自旋一段时间,超过计数阈值后再休眠。对同一个互斥量加锁两次,自身就会陷入死锁状态。
读写锁
读写锁 带超时的读写锁:防止获取读写锁的时候陷入永久阻塞状态
条件变量
允许线程已无竞争的方式等待特定的条件发生。放入队列并休眠,等待合适的条件成立后再唤醒
屏障
协调多个线程并行工作的同步机制,允许每个线程等待,直到所有的合作线程都到达某一点