首页 文章

为什么std :: thread :: spawn()出错而不是返回Result?

提问于
浏览
1

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

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

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

2 回答

  • 2

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

    从我的角度来看,这会更安全 .

    它不会 .

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

    这是非常安全的 .

    此外,它将统一两个函数的返回类型 .

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

    引用艾默生:

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

    请记住,在Rust中, Result 不能被忽略,必须得到承认和处理 . 这有点削弱了捷径的 Value . 相比:

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

    后者更像是捷径!

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

    Convenience .

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

    • Builder API提供对每个方面的细粒度控制,代价是冗长,

    • 自由函数API提供了一种简洁的方法来快速生成线程,但代价是控制 .

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

    不这样做的代价是许多人会默认引入 unwrap 功能 . 各自己自己 . 跳项目会更难 .

  • 4

    像OOM一样在"out of resources"上生锈 . 在这种情况下,"can't create thread"错误必须表示硬限制或软限制资源(请参阅pthread_create errors) . 从技术上讲还有其他错误,但是看看暴露的API我从安全的Rust代码到达它们并且我认为windows错误非常相似 . 但是Rust不会让你干净利落地尝试一些动作并检查它是否成功 . 对于堆分配,这当前意味着您需要使用unstable APIs,但这些正在改进(截至2017年7月11日已经在夜间)并且很可能在未来稳定 .

相关问题