视频地址:
http://player.bilibili.com/player.html?aid=31289365&bvid=BV1iW411d7hd&cid=225611457&page=26
视频地址:
课件地址:
本章对应于书中的12.6。
根据程序逻辑流的数目,可以将程序分为顺序程序和并发程序,其中顺序程序只有一个逻辑流,而并发程序具有多个逻辑流。当在多个处理器中运行并发程序时,就成为了并行程序,速度会更快,因为内核在多个核上并行地调度这些并行线程,而不是在单个核上顺序地调度。
我们以一个简单的例子来看并行程序的例子,用并行程序来计算 的和。首先,我们可以根据线程数目将这些数字划分成若干个组,每个线程在自己的组中计算结果,再将其放入一个共享全局变量中,需要用互斥锁保护这个变量。
第30行中我们将每个线程的组号作为参数传递到线程例程中,再让主线程等待所有对等线程运行完毕,再与正确结果比较是否正确。
在线程例程中,首先根据组号计算出线程需要计算的范围,然后对全局变量进行加和时,要注意用互斥锁将其保护起来。我们可以得到这个程序在四核系统上计算 $2^{31}$ 的性能为
单位为秒
可以发现效果很差,其实主要原因是由于P
和V
对互斥锁的保护。我们可以将每个线程计算的结果保存在全局数组中的特定位置,这样就不用对数组进行保护