首页 > 解决方案 > 您如何等待分离的线程或控制线程的产生方式?

问题描述

spawn被调用时, aJoinHandle返回,但如果该句柄被丢弃(或不可用,在板条箱内的某处),则线程被“分离”。

有什么方法可以找到当前正在运行的所有线程并JoinHandle为它们恢复一个?

...我的感觉是,总的来说,答案是否定的。

在这种情况下,是否有任何方法可以覆盖全局Thread调用方式或JoinHandle删除方式?

...但是查看源代码,我看不出有任何可能。

作为动机,这个非常长的讨论建议使用范围来强制终止子线程;join当作用域结束时,在每个子线程上有效地执行 a 。但是,它需要通过自定义方法生成子线程才能工作;能够在 Rust 中做类似的事情会非常有趣,其中任何产生的线程都被拦截并作为 threadlocal 上活动环境范围的父级。

我会接受任何答案:

标签: rust

解决方案


有什么方法可以找到当前正在运行的所有线程并JoinHandle为它们恢复一个?

不,这可能会对想要使用线程的每个人施加限制/开销,这与系统编程语言是对立的。

您可以为此编写自己的解决方案,方法是使用Arc/Weak和全局单例。然后你就有了自己的线程注册表。

有什么方法可以覆盖全局Thread的调用方式或JoinHandle删除方式?

不,现在存在的 Rust 库无法做到这一点。事实上,在这种规模上“覆盖”某些东西与静态编译语言的概念是完全对立的。想象一下,如果您使用的任何库可以决定“覆盖”加法的工作方式或做了什么println。有些语言确实允许这种动态性,但这是有代价的。Rust 不是正确的语言。

事实上,正确的解决方案并不是什么新鲜事:只需使用依赖注入。“启动线程”是一个重要的协作者,可能不属于大多数库的范围,因为它是一个应用程序范围的资源。

可以在掉落之前恢复

在 Rust 中,值在它们最后一次使用的范围的末尾被删除。这将需要在程序中任何位置的任意函数的序言处运行任意代码。这样的功能极不可能实现。


有一些关于创建一个方法的讨论,该方法将返回一个句柄,当它被删除时加入线程,这可能会做你想要的,但人们仍然必须调用它。


推荐阅读