第四章并发编程
介绍Pthread中的线程操作,包括线程管理函数,互斥量、连接、条件变量和屏障等线程同步工具。
-
4.1并行计算导论
-
4.1.1顺序算法与并序算法
使用cobegin-coend代码块来指定并行算法的独立任务。之将这些任务完成。
-
4.1.2并行性与并发性
并行算法只识别可并行执行的任务;只发生在多处理器或者多核系统中。并发执行可以 -
4.2线程
-
4.2.1线程原理
进程模型中,进程是独立执行单元。所有进程都在内核模式或者用户模式下执行。线程是某进程同一地址空间上的独立执行单元。创建某个进程就是在唯一的地址空间创建一个主线程。
-
4.2.2线程的优点
(1)线程创建和切换速度更快。因为不需要获取新的资源和物理地址空间。
(2)响应速度更快。一个线程被挂起,这个程序的其他线程还能在后台继续运算。
(3)线程更是和并行运算。并行计算的目标是使用多个执行路径更快地解决问题。基于分治原则的算法经常表现出高度的并行性,通过使用并行或者并发执行来提高计算速度。这种算法有要求实体共享公用数据。不同进程需要在不同地址间进行数据交换;而线程共享同一地址空间中的所有数据。所以线程编写并运行的程序比使用进程编程更简单,更自然。 -
4.2.3线程的缺点
(1)由于地址空间共享,线程需要来自由用户的明确同步。
(2)许多库函数可能对于线程不安全。
(3)在单CPU系统上,在线程解决问题实际上要比使用顺序程序慢。 -
4.3线程操作
线程执行轨迹与进程类似。几乎所有操作系统都支持POSIX Pthread,定义了一系列标准应用程序编程接口(API)来支持线程编程 -
4.4线程管理函数
Pthread提供一下五个线程管理API
-
4.4.1创建线程
ptread_cread()
成功返回0 。失败返回错误代码。
参数
Attr
实现
-
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中锁被称作互斥量。
两种初始化互斥量的方法
Attr参数
示例4.3
-
4.6.2死锁预防
互斥量使用封锁协议。日过线程不能获取互斥量,就会发生阻塞,等待互斥量解锁后在继续。
死锁一种状态,这种状态下,许多执行实体相互等待,一次都无法继续。
执行条件加锁和退避来预防死锁。 -
4.6.3条件变量
锁,互斥量仅用于确保线程只能互斥地方临界区中的的共享数据对象。条件变量提供乐一中线程写作方法。条件变量总是与互斥量一起使用。互斥是所有同步机制的基础。在Pthread中使用**pthread_cond_t **来声明条件变量,必须初始化。使用方法:
-
4.6.4生产者—消费者问题
示例程序4.4
-
4.6.5信号量
进程同步的一般机制
数据结构
PV原语
信号量函数
-
4.6.6屏障
线程连接操作允许某线程(通常是主程序)等待其他线程终止。在某些情况下,保持线程活动会更好,但应该要求它们在所有线程都达到指定同步点之前不能继续活动。在Pthread中,采用屏障机制。
创建屏障对象
-
4.6.7用并发线程解线性方程组
示例4.5
-
4.6.8Linux中的线程
Linux操作系统不区分进程和线程。对于linux内核,线程只是一个与其他进程共享某些资源的进程。
进程和线程都用clone()系统调用创建
宏定义
资源存储