Multithreading 如何从阻塞的TcpListener::accept调用中断?
我在一个单独的线程中运行循环。我想优雅地关闭这个线程,但我看不到任何类型的Multithreading 如何从阻塞的TcpListener::accept调用中断?,multithreading,api,rust,shutdown,Multithreading,Api,Rust,Shutdown,我在一个单独的线程中运行循环。我想优雅地关闭这个线程,但我看不到任何类型的shutdown机制可以用来中断接受 我目前的做法如下: use std::net::TcpListener; use std::thread::spawn; fn main() { let tcp_listener = TcpListener::bind((("0.0.0.0"), 0)).unwrap(); let tcp_listener2 = tcp_listener.try_clone().un
shutdown
机制可以用来中断接受
我目前的做法如下:
use std::net::TcpListener;
use std::thread::spawn;
fn main() {
let tcp_listener = TcpListener::bind((("0.0.0.0"), 0)).unwrap();
let tcp_listener2 = tcp_listener.try_clone().unwrap();
let t = spawn(move || {
loop {
match tcp_listener2.accept() {
Ok(_) => { }
Err(_) => { break; }
}
}
});
drop(tcp_listener);
assert!(t.join().is_ok());
}
但这并不能解决问题(可能是因为我只删除了克隆副本?)。有没有想过如何正确关闭这样的线程
(供参考)这个问题是一个基本问题,因为最后,
accept()
调用被转换为一个libc::accept()
(请参阅和)
解决方案是使用非阻塞io,例如
Edi:经过考虑,我研究了使用
close()
中断accept()
的可能性。这似乎不可靠。但是出现了:使用shutdown()
TcpStream
公开了此函数,但这似乎是唯一的情况。这可能是API的一个缺点?谢谢,您可能是对的,API中缺少该功能。我给了你+1,但我想再等一会儿,也许有人有不同的解释。