gpt4 book ai didi

rust - 您如何等待分离的线程或控制线程的产生方式?

转载 作者:行者123 更新时间:2023-11-29 08:00:19 25 4
gpt4 key购买 nike

spawn 被调用时,一个 JoinHandle 被返回,但是如果那个句柄被丢弃(或者不可用,在 crate 的某处),线程被“分离”。

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

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

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

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

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

我会接受以下任一答案:

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

最佳答案

Is there any way to find all threads currently running and recover a JoinHandle for them?

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

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

is there any way to override either how Thread is invoked, or how JoinHandle is dropped, globally?

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

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

can be recovered before it is dropped

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


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

关于rust - 您如何等待分离的线程或控制线程的产生方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50111143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com