fork-join模式是将一个大任务分解成多个子任务,各个子任务之间相互独立执行,完成各个子任务则完成大任务。该模型是并发编程的重要模型,能很好的利用多核cpu。程序设计得当,性能能够有N倍提升。下面看一个例子。
Rust实例:
use std::sync::Arc;
use std::thread;
fn main() {
let mut threads_v = vec![];
let vs = Arc::new(vec![
"1".to_owned(),
"2".to_owned(),
"3".to_owned(),
"4".to_owned(),
"5".to_owned(),
]);
for i in 0..(vs.len() + 1) / 2 {
let cvs = vs.clone();
let start = 2 * i;
let end = (start + 2).min(vs.len());
let hdl = thread::spawn(move || {
for v in &cvs[start..end] {
println!("thread{}: {}", i, v);
}
});
threads_v.push(hdl);
}
for hdl in threads_v {
hdl.join().unwrap();
}
}
实例输出:
thread0: 1
thread0: 2
thread2: 5
thread1: 3
thread1: 4
上面的例子是将大任务分解成大小为2的小任务,主线程阻塞等待子线程完成。
题外话
线程池的实现一般也是fork-join模型。将需要运行的资源打包成一个task,将task加入到队列中,激活线程,获取队列中的task,消耗资源完成task。