为什么std :: thread :: spawn()会因为错误而不是返回结果而发生混乱?

时间:2017-07-10 18:46:09

标签: rust

在Rust的标准库中,有两种方法可以生成一个线程:

它们之间的区别在于,当操作系统无法创建线程时,前者会发生恐慌,而后者会返回Result

为什么std::thread::spawn()只返回Result而不是恐慌?从我的角度来看,这会更安全。此外,它将统一两个函数的返回类型。什么是背后的动机"默认恐慌"在这种特殊情况下?

2 个答案:

答案 0 :(得分:4)

免责声明:如上所述,确切的推理可能难以理解;然而,我们可以看看事实。

  

从我的观点来看,这会更安全。

不会。

恐慌不会导致内存或线程不安全,也不是可以忽略的错误信号方法。

这是非常安全的。

  

此外,它将统一两种函数的返回类型。

会的。这将是一个喜忧参半的祝福。

引用艾默生:

  

愚蠢的一致性是小脑袋的大人物

请记住,在Rust中Result不能被忽略, 要被确认和处理。这有点削弱了捷径的价值。比较:

let h = Builder::new().spawn(f).unwrap();

let h = spawn(f).unwrap();

let h = spawn(f);

后者更像是捷径!

  

在这种特殊情况下,“默认恐慌”背后的动机是什么?

<强>便利

线程API围绕两个互补的API构建:

  • Builder API提供对每个方面的细粒度控制,但代价是冗长,
  • 免费功能API提供了一种简洁的方法来快速生成线程,但代价是控制。

这样,无论您是想要控制还是简洁,都有适合您的标准API。

不这样做的成本是许多人默认情况下会引入unwrap。各自己自己。跳项目会更难。

答案 1 :(得分:2)

在像OOM这样的“资源不足”上生锈。在这种情况下,“无法创建线程”错误必须表示硬性或软性有限资源(请参阅pthread_create errors)。从技术上讲还有其他错误,但是看看暴露的API,我会说你无法从安全的Rust代码中找到它们,我认为windows错误非常相似。但是,如果没有一个逃生舱,允许你干净地尝试一些动作并检查它是否成功,Rust就不会是一个系统编程语言。对于堆分配,这当前意味着您需要使用unstable APIs,但这些正在改进(截至2017年7月11日已经在夜间)并且很可能在未来稳定。