Doc*_*r J 10 multithreading rust
当我spawn在Rust中使用一个线程时,我得到一个JoinHandle,这对于...加入(一个阻塞操作)是好的,而不是其他的.如何检查子线程是否JoinHandle.join()已从父线程退出(即,不会阻止)?如果您知道如何杀死子线程,则可获得奖励积分.
我想你可以通过创建一个频道,向孩子发送一些东西,捕捉错误来做到这一点,但这似乎是不必要的复杂性和开销.
从Rust 1.7开始,标准库中没有API来检查子线程是否已经退出而没有阻塞.
便携式解决方法是使用频道从孩子向父母发送消息,以表示孩子即将退出.Receiver有一个非阻塞try_recv方法.何时try_recv收到消息,您可以使用join()它JoinHandle来检索线程的结果.
还有一些不稳定的特定于平台的扩展特性,可以让您获得原始线程句柄.然后,您必须编写特定于平台的代码来测试线程是否已退出.
如果您认为此功能应该在Rust的标准库中,您可以提交RFC(请务必先阅读README!).
如果您知道如何杀死子线程,则可获得奖励积分.
Rust中的线程使用本机OS线程实现.即使操作系统可能会提供一种方法来杀死一个线程,这是一个坏主意,这样做,因为直到该线程分配的资源将不被清理过程结束.
简短的答案是不可能的.但这不是应该真正解决的问题.
如果您知道如何杀死子线程,则可获得奖励积分.
决不
即使在支持杀死线程的语言中(请参阅此处的Java),建议不要这样做.
线程的执行通常使用明确的交互点进行编码,并且通常存在隐含的假设,即不会发生其他中断.
最令人震惊的例子当然是资源:天真的"kill"方法是停止执行线程; 这意味着不会释放任何资源.你可能会想到记忆,这是你最不担心的事情.相反,想象一下,所有Mutex未解锁的东西都将在以后产生死锁......
另一个选择是panic在线程中注入一个会导致展开的线程.但是,你不能只是开始在任何时候平仓!该程序必须定义安全点,注入a panic将被保证是安全的(在任何其他点注入它意味着可能破坏共享对象); 如何定义这样的安全点并注入panic本地语言中存在一个开放的研究问题,特别是那些在系统上执行的问题W^X(内存页面可写或可执行但从不兼容).
总之,没有已知的方法来安全地(在内存方面和功能方面)杀死一个线程.
有可能,朋友。使用refcounters这生锈的下降结束或恐慌。100%安全。例:
use std::time::Duration;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
use std::thread;
fn main() {
// Play with this flag
let fatal_flag = true;
let do_stop = true;
let working = Arc::new(AtomicBool::new(true));
let control = Arc::downgrade(&working);
thread::spawn(move || {
while (*working).load(Ordering::Relaxed) {
if fatal_flag {
panic!("Oh, my God!");
} else {
thread::sleep(Duration::from_millis(20));
println!("I'm alive!");
}
}
});
thread::sleep(Duration::from_millis(50));
// To stop thread
if do_stop {
match control.upgrade() {
Some(working) => (*working).store(false, Ordering::Relaxed),
None => println!("Sorry, but thread died already."),
}
}
thread::sleep(Duration::from_millis(50));
// To check it's alive / died
match control.upgrade() {
Some(_) => println!("Thread alive!"),
None => println!("Thread ends!"),
}
}
Run Code Online (Sandbox Code Playgroud)
要点:https : //gist.github.com/DenisKolodin/edea80f2f5becb86f718c330219178e2
在操场上:https : //play.rust-lang.org/? gist = 9a0cf161ba0bbffe3824b9db4308e1fb & version = stable & backtrace =0
UPD:我创建了thread-control实现此方法的板条箱:https : //github.com/DenisKolodin/thread-control
从 Rust 1.61.0 开始,有一种is_finished方法。
https://doc.rust-lang.org/stable/std/thread/struct.JoinHandle.html#method.is_finished
| 归档时间: |
|
| 查看次数: |
2521 次 |
| 最近记录: |