Ch 11 线程

有利于提高程序的吞吐量,便于共享资源,交互程序可以使用多线程来改善响应时间

线程包含有:标识线程的线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据。 进程的所有信息对线程都是共享的

创建线程 pthread_create

线程创建时并不能保证哪个线程会先执行

线程终止

如果进程中的任意线程调用了 exit,_Exit,_exit,那么整个进程就会终止

3种方式退出:

  • 从启动例程中返回,返回值是线程的退出码
  • 线程可以被同一进程中的其他线程取消
  • 线程调用 pthread_exit

调用线程将一直阻塞直到指定的线程调用 pthread_exit 或从启动例程中返回或者被取消

如果共享的变量分配在栈上,那么可能在线程退出之后的那段栈内存会被挪作他用,因此最好将共享变量设为全局变量或者使用 malloc 分配

线程可以通过 pthread_cancel 来请求取消同一进程中的其他进程,这个函数并不阻塞,而仅仅是提出请求

在派生线程中通过 pthread_cancel 取消一个进程的主线程,进程不会退出,派生线程会继续运行即便没有主线程,当最后一个线程退出的时候进程才会退出。这与进程的 main 函数返回导致进程退出进而强制终止派生线程的情况有本质区别

线程同步

一个变量的增加需要:

  1. 从内存单元读入寄存器
  2. 在寄存器中做增量操作
  3. 把新值写回内存

自旋锁

忙等待

互斥量

先自旋一段时间,超过计数阈值后再休眠。对同一个互斥量加锁两次,自身就会陷入死锁状态。

读写锁

读写锁 带超时的读写锁:防止获取读写锁的时候陷入永久阻塞状态

条件变量

允许线程已无竞争的方式等待特定的条件发生。放入队列并休眠,等待合适的条件成立后再唤醒

屏障

协调多个线程并行工作的同步机制,允许每个线程等待,直到所有的合作线程都到达某一点