Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何从阻塞的TcpListener::accept调用中断?_Multithreading_Api_Rust_Shutdown - Fatal编程技术网

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,但我想再等一会儿,也许有人有不同的解释。