在Rust的标准库中,有两种方法可以生成一个线程:
它们之间的区别在于,当操作系统无法创建线程时,前者会发生恐慌,而后者会返回Result
。
为什么std::thread::spawn()
只返回Result
而不是恐慌?从我的角度来看,这会更安全。此外,它将统一两个函数的返回类型。什么是背后的动机"默认恐慌"在这种特殊情况下?
答案 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。
不这样做的成本是许多人默认情况下会引入unwrap
。各自己自己。跳项目会更难。
答案 1 :(得分:2)
在像OOM这样的“资源不足”上生锈。在这种情况下,“无法创建线程”错误必须表示硬性或软性有限资源(请参阅pthread_create errors)。从技术上讲还有其他错误,但是看看暴露的API,我会说你无法从安全的Rust代码中找到它们,我认为windows错误非常相似。但是,如果没有一个逃生舱,允许你干净地尝试一些动作并检查它是否成功,Rust就不会是一个系统编程语言。对于堆分配,这当前意味着您需要使用unstable APIs,但这些正在改进(截至2017年7月11日已经在夜间)并且很可能在未来稳定。