第四章 并发编程
这一章主要介绍了并发编程的相关内容,包括并行计算、顺序算法与并行算法以及并行性和并发性;解释了线程的原理机器相对于进程的优势,同时还进行了线程管理、并发编程的实际操作,让我们更加深刻地了解多任务处理、线程同步和并发编程的原理及方法。
并行计算
基于分治原则(如二叉树查找和快速排序等)的算法经常表现出高度的并行性,可通过使用并行或并发执行米提高计算速度。并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器 更快速地解决问题。
井行性与并发性
并行算法只识别可并行执行的任务,但是它没有规定如何将任务映射到处理组件。在理想情况下,并行算法中的所有任务都应该同时实时执行。然而,真正的并行执行只能在有多个处理组件的系统中实现,比如多处理牉或多核系统。在单CPU系统中,一次只能执行一个任务。在这种情况下,同的任务只能并发执行,即在逻辑上并行执行。在单CPU系统中并发性是通过多任务处理来实现的。
线程
(1)线程原理
一个操作系统包含许多并发进程。在进程模型中,进程是独立的执行单元。所有进程均是在内核模式和用户模式下进行的。
内核模式下:各进程在唯一地址空间上执行,与其他进程是分开的,多个独立的进程共用同一个执行路径,当某进程必须等待某事件时,整个进程就会停止执行。
线程是某进程同一地址空间上的独立执行单元。创建某个进程就是在一个唯一地址空间创建一个主线程。
(2)线程优点
1.线程创建和切换速度更快
2.线程的响应速度更快
3.线程更适合并行计算
(3)线程缺点
1.由于地址空间共享,县城需要来自用户的明确同步
2.许多库函数可能对线程不安全
3.在单CPU系统上,使用线程解决问题实际上要比使用顺序程序更慢。
线程管理函数
(1)创建线程
`int pthread_create(pthread_t *thread_id,pthread_attr_t attr,void (func)(void), void *arg);```
(2)线程ID
int pthread_equal(pthread_t t1,pthread_t t2);
如果是不同线程,返回0;否则,返回非0。
(3)线程终止
void pthread_exit(void *status);
0退出值表示正常终止,否则为异常终止。
(4)线程连接
int pthread_join (pthread_t thread, void **status ptr);
线程同步
(1)互斥量
最简单的同步工具是锁,它允许执行实体仅在有锁的情况下才能继续执行。在Pthread中,锁被称为互斥量,意思是相互排斥。在使用之前必须对他们进行初始化。
静态方法:定义互斥量m,并使用默认属性对其进行初始化。
pthreaa_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
动态方法: 使用pthread_ mutex _init()函数,可通过attr参数设置互斥属性。
(2)死锁预防
简单的死锁预防是对互斥量进行排序,并确保每个线程只在一个方向请求互斥量,这样请求序列中就不会有循环。
(3)条件变量
条件变量提供线程协作的方法。同样需要初始化,且方法同互斥量相同。
(4)信号量
信号量是进程同步的一般机制。比条件变量多一个计数器。
(5)屏障
屏障是线程的集合点。当所有线程到达屏障时,所有线程重新开始执行。