如何等待分离的线程或控制线程的生成方式?

时间:2018-05-01 03:54:43

标签: rust

当调用spawn时,会返回JoinHandle,但如果该句柄被丢弃(或不可用,则在包中的某个位置),该线程将被“分离”。

有没有办法找到当前正在运行的所有线程并为它们恢复JoinHandle

......我的感觉是,一般来说,答案是肯定的。

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

......但是从源头上看,我看不出任何可能的方式。

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

我接受任何答案:

  • 演示如何通过任何可能的方式恢复JoinHandle
  • 演示了如何以某种方式覆盖thread::spawn()的行为,以便在删除某个子函数中调用的线程中丢弃的JoinHandle之前可以恢复它。

1 个答案:

答案 0 :(得分:2)

  

有没有办法找到当前正在运行的所有线程并为它们恢复Arc

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

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

  

是否可以覆盖全局调用JoinHandle的方式或删除println的方式?

不,现在无法使用Rust库来执行此操作。实际上,“覆盖”某种规模的东西与静态编译语言的概念是完全相反的。想象一下,如果您使用的任何库可以决定“覆盖”添加的工作方式或<div class="container"> <button>a normal button</button> <button>tiny</button> <button class="parent"> <div class="child">a rhhh, really wide button lskdfjlasdkfj lksjd flaksjd flaskdjf lkj</div> </button> </div> 做了什么。有些语言允许这种动态,但它需要付出代价。 Rust不是正确的语言。

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

  

可以在删除之前恢复

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

There's some discussion关于创建一个方法,该方法将返回一个句柄,该句柄在被删除时加入一个线程,可能做你想做的事,但人们仍然需要调用它