返回介绍

11.1 线程

发布于 2024-10-13 11:25:32 字数 1814 浏览 0 评论 0 收藏 0

并发体系由标准库,而非语言提供支持。这意味着,可能有很多不同的产品可供选择。

  • 1:1 系统线程来提供并发支持。
  • 主线程(main)不会等待其他线程结束。

println! 并发安全。

use std::thread;

fn main() {
  let handler = thread::spawn(|| {
    for i in 1..10 {
      println!("{}", i);
    }
  });

  // 等待线程结束并获取返回值。
  handler.join().unwrap();  
}
use std::thread;

fn main() {

  // 设置线程参数并命名,以便于调试。
  let builder = thread::Builder::new()
                .name("name".into())
                .stack_size(20 * 1024);

  // 返回 Result,应对创建线程失败。
  let handler = builder.spawn(|| {
    for i in 1..10 {
      println!("{}", i);
    }
  }).unwrap();

  handler.join().unwrap();
}

接收闭包函数返回值。

use std::thread;

fn main() {
  let handler = thread::spawn(|| {
    100
  });

  assert_eq!(handler.join().unwrap(), 100);
}

鉴于不同线程生命周期的差异,强制转移环境变量所有权。

至于借用,因编译器无法识别 Join 调用,无法保证 main 生命周期长过新建线程,而导致生命周期问题。

use std::thread;

fn main() {
  let data = vec![1, 2, 3, 4];

  let handler = thread::spawn(|| {
                ^^ may outlive borrowed value `data`
                
    println!("{:?}", &data);
  });

  handler.join().unwrap();
}
use std::thread;

fn main() {
  let data = vec![1, 2, 3, 4];

  let handler = thread::spawn(move || {
    println!("{:?}", &data);
  });

  handler.join().unwrap();
}

作用域线程

非所有权转移方案,可用作用域线程(scoped thread)解决。它确保闭包线程在作用域结束之前完成,而作用域生命周期却可被编译期有效识别。

use std::thread::scope;

fn main() {
  let data = vec![1, 2, 3, 4];

  // 确保所创建线程在此生命周期范围内。
  // 等待(auto join)所有新建线程结束。
  scope(|s| {
    s.spawn(|| {
      println!("{:?}", &data);
    });

    s.spawn(|| {
      println!("{:?}", &data);
    });
  });
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文