(快速参考)

概念

ForkJoinPool

处理数据通常涉及操作集合。列表、数组、集合、映射、迭代器、字符串以及许多其他数据类型都可以被视为项目的集合。处理此类集合的常见模式是按顺序逐个获取元素,并对每个元素进行操作。例如,min() 函数应该返回集合中最小的元素。当您在数字集合上调用 min() 方法时,调用线程将创建一个累加器或迄今为止最小的值,该值初始化为给定类型的最小值,例如零。然后,线程将遍历集合中的元素,并将它们与累加器中的值进行比较。处理完所有元素后,最小值将存储在累加器中。

然而,这个算法虽然简单,但在多核硬件上却完全错误。在双核芯片上运行 min() 函数最多只能利用芯片 50% 的计算能力。在四核芯片上,它只会是 25%。没错,这个算法实际上浪费了芯片 75% 的计算能力。

树状结构被证明更适合并行处理。min() 函数在我们的示例中不需要按顺序遍历所有元素并将它们的值与累加器进行比较。它可以做的是依赖于硬件的多核特性。例如,一个 parallel_min() 函数可以比较集合中相邻值的成对(或特定大小的元组),并将元组中最小的值提升到下一轮比较。在不同的元组中搜索最小值可以在并行中安全地发生,因此同一轮中的元组可以同时由不同的内核处理,而不会出现竞争或线程之间的冲突。