第四章 并发进程
4.1 并行计算导论
并行计算是一种计算方案,它尝试使用多个执行算法的处理器更快速地解决问题
计算的未来发展方向是并行计算
并行算法原理如图:

4.1.1 顺序算法与并行算法
在描述顺序算法时,常用的方法是用一个begin-end代码块列出算法
顺序算法包含多个步骤,所有步骤通过单个任务依次执行,每次执行一个步骤
并行算法的描述,使用cobegin-coend代码块来指定
在cobegin-coend块中,所有任务都是并行执行的

4.1.2 并行性与并发性

理想情况下,并行算法中的所有任务都应该同时实时执行
真正的并行执行只能在有多个处理组件的系统中实现
4.2 线程
实现线程主要有三种方式:
(1)使用内核线程实现
(2)使用用户线程实现
(3)使用用户线程加轻量级进程混合实现
4.2.1 线程的原理

4.2.2 线程的优点
(1)线程创建和切换速度更快
(2)线程的响应速度更快
(3)线程更适合并行计算
4.2.3 线程的缺点
(1)由于地址空间共享,线程需要来自用户的明确同步
(2)许多库函数可能对线程不安全
(3)单CPU系统上,线程解决问题比顺序程序慢
总结:这里我们总结了线程的优缺点,顺带找到了进程的优缺点

4.3 线程操作
4.4 线程管理函数
4.4.1 创建线程
使用pthread_create()函数创建线程

4.4.2 线程ID
线程ID是一种不透明的数据类型,取决于实现情况
4.4.3 线程终止
线程函数结束后,线程即终止
4.4.4 线程连接
一个线程可以等待另一个线程的终止
4.5 线程示例程序
4.5.1 用线程计算矩阵的和
4.5.2 用线程快速排序
4.6 线程同步
4.6.1 互斥量

最简单的同步工具是锁,在Pthread中,锁被称为互斥量,意思是相互排斥。
两种方法可以初始化互斥量:
(1)静态方法:定义互斥量m,并使用默认属性对其初始化
(2)动态方法:使用pthread_mutex_init()函数,可通过attr参数设置互斥属性
4.6.2 死锁预防
死锁是一种状态,在这种状态下,许多执行实体相互等待,因此都无法继续下去
4.6.3 条件变量
条件变量提供一种线程协作的方法
条件变量总是与互斥量一起使用
条件变量也可以通过两种方法进行执行化
(1)静态方法:定义条件变量con,并使用默认属性对其初始化
(2)动态方法:使用pthread_mutex_init()函数,可通过attr参数设置条件变量
4.6.4 生产者-消费者问题
生产者-消费者问题,也称有限缓冲问题
4.6.5 信号量
信号量是进程同步的一般机制。信号量是一种数据结构

4.6.6 屏障
4.6.7 用并发线程解线性方程组
4.6.8 Linux中的线程
与许多其他操作系统不同,Linux不区分进程和线程