Rust - 并发编程

  • 简述

    在并发编程中,程序的不同部分独立执行。另一方面,在并行编程中,程序的不同部分同时执行。随着越来越多的计算机利用其多处理器的优势,这两种模型同样重要。
  • 线程

    我们可以使用线程同时运行代码。在当前的操作系统中,一个执行程序的代码运行在一个进程中,操作系统同时管理多个进程。在您的程序中,您还可以拥有同时运行的独立部分。运行这些独立部分的功能称为线程。

    创建线程

    thread::spawn函数用于创建新线程。spawn 函数接受一个闭包作为参数。闭包定义了应该由线程执行的代码。以下示例打印来自主线程的一些文本和来自新线程的其他文本。
    
    //import the necessary modules
    use std::thread;
    use std::time::Duration;
    fn main() {
       //create a new thread
       thread::spawn(|| {
          for i in 1..10 {
             println!("hi number {} from the spawned thread!", i);
             thread::sleep(Duration::from_millis(1));
          }
       });
       //code executed by the main thread
       for i in 1..5 {
          println!("hi number {} from the main thread!", i);
          thread::sleep(Duration::from_millis(1));
       }
    }
    

    输出

    
    hi number 1 from the main thread!
    hi number 1 from the spawned thread!
    hi number 2 from the main thread!
    hi number 2 from the spawned thread!
    hi number 3 from the main thread!
    hi number 3 from the spawned thread!
    hi number 4 from the spawned thread!
    hi number 4 from the main thread!
    
    主线程打印从 1 到 4 的值。
    注意− 主线程结束时,新线程将停止。该程序的输出每次可能略有不同。
    thread::sleep函数强制一个线程在短时间内停止执行,允许另一个线程运行。线程可能会轮流执行,但这并不能保证——这取决于操作系统如何调度线程。在这次运行中,主线程首先打印,即使来自衍生线程的打印语句首先出现在代码中。此外,即使生成的线程被编程为将值打印到 9,它也只能在主线程关闭之前达到 5。
  • 连接句柄

    生成的线程可能没有机会运行或完全运行。这是因为主线程完成得很快。函数spawn<F, T>(f: F) -> JoinHandlelt;T>返回一个 JoinHandle。JoinHandle 上的join()方法等待关联的线程完成。
    
    use std::thread;
    use std::time::Duration;
    fn main() {
       let handle = thread::spawn(|| {
          for i in 1..10 {
             println!("hi number {} from the spawned thread!", i);
             thread::sleep(Duration::from_millis(1));
          }
       });
       for i in 1..5 {
          println!("hi number {} from the main thread!", i);
          thread::sleep(Duration::from_millis(1));
       }
       handle.join().unwrap();
    }
    

    输出

    
    hi number 1 from the main thread!
    hi number 1 from the spawned thread!
    hi number 2 from the spawned thread!
    hi number 2 from the main thread!
    hi number 3 from the spawned thread!
    hi number 3 from the main thread!
    hi number 4 from the main thread!
    hi number 4 from the spawned thread!
    hi number 5 from the spawned thread!
    hi number 6 from the spawned thread!
    hi number 7 from the spawned thread!
    hi number 8 from the spawned thread!
    hi number 9 from the spawned thread!
    
    主线程和衍生线程继续切换。
    NOTE − 由于调用了主线程,主线程等待生成的线程完成 join() 方法。