Rust笔记 - fork-join多线程模型

1,318 阅读1分钟

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。