Исходя из 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
и пытался получить это ErrorKind
с отправкой SIGINT
в поток, но поток, кажется, немедленно умирает, не оставляя (обратного) следа.
Вот код, который я использовал(примечание: еще не очень хорошо разбирается в 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();
}
Под "операциями блокировки" я имею в виду:
- sleep
- сокет IO
- file IO
- IO очереди (еще не уверен, где находятся очереди в Rust)
Что бызначит означает сигнализировать потоку, как Thread.interrupt()
в Java, что пора собираться и идти домой?