August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
我们称可与其他计算并行执行的计算为任务(task)。线程(thread)是任务在程序中的系统级表示。若要启动一个与其他任务并发执行的任务,可构造一个std::thread(可在<thread>中找到),将任务作为它的参数。这里,任务是以函数或函数对象的形式实现的:
join()保证在线程完成后才退出user()。“join”一个thread表示“等待线程结束”。
一个程序的所有线程共享单一地址空间。在这一点上,线程与进程不同,进程间通常不直接共享数据。由于共享单一地址空间,因此线程间可通过共享对象(参见15.5节)相互通信。通常通过锁或其他防止数据竞争(对变量的不受控制的并发访问)的机制来控制线程间通信。
编写并发任务可能非常棘手。任务f(一个函数)和F(一个函数对象)可以这样实现:
这是一个典型的严重错误:在本例中,f和F都使用了对象cout,而没有采取任何形式的同步。输出结果将是不可预测的,而且程序每一次执行都可能得到不同结果,因为两个任务中的操作的执行顺序是不确定的。程序可能会产生下面这样“奇怪的”输出:
ostream的定义中存在可能导致程序崩溃的数据竞争,只有在C++标准中给出了专门的保证后,我们才能免受其害。
当定义一个并发程序的任务时,我们的目标是保持任务的完全隔离,唯一的例外是任务间通信的部分,而这种通信应该以一种简单而明显的方式进行。思考一个并发任务的最简单的方式是,将它看作一个可以与调用者并发执行的函数。为此,我们只需传递参数、获取结果并保证两者并不同时使用共享数据(没有数据竞争)。 ...
Read now
Unlock full access