【发布时间】:2019-02-27 03:32:36
【问题描述】:
来自Java,我习惯了类似的成语
while (true) {
try {
someBlockingOperation();
} catch (InterruptedException e) {
Thread.currentThread.interrupt(); // re-set the interrupted flag
cleanup(); // whatever is necessary
break;
}
}
据我所知,这适用于整个 JDK 中的任何可能阻塞的内容,例如从文件、套接字、队列甚至 Thread.sleep() 读取。
阅读如何在 Rust 中完成此操作,我发现提到了许多看似特殊的解决方案,例如 mio、tokio。我还找到了ErrorKind::Interrupted,并尝试通过将SIGINT 发送到线程来获取此ErrorKind,但线程似乎立即死亡而没有留下任何(返回)痕迹。
这是我使用的代码(注意:还不是很精通 Rust,所以它可能看起来有点奇怪,但它可以运行):
use std::io;
use std::io::Read;
use std::thread;
pub fn main() {
let sub_thread = thread::spawn(|| {
let mut buffer = [0; 10];
loop {
let d = io::stdin().read(&mut buffer);
println!("{:?}", d);
let n = d.unwrap();
if n == 0 {
break;
}
println!("-> {:?}", &buffer[0..n]);
}
});
sub_thread.join().unwrap();
}
“阻塞操作”是指:
- 睡觉
- socket IO
- 文件 IO
- 队列 IO(尚不确定队列在 Rust 中的位置)
分别以什么方式向线程(如 Java 中的 Thread.interrupt())发出信号,表明该收拾行李回家了?
【问题讨论】:
标签: multithreading rust terminate