multithreading - Rust 中为线程或函数创建超时的正确方法是什么?

标签 multithreading rust

这是我的代码:

use std::net;
use std::thread;

fn scan_port(host: &str, port: u16) -> bool {
    let host = host.to_string();
    let port = port;
    let t = thread::spawn(move || net::TcpStream::connect((host.as_str(), port)).is_ok());

    t.join().unwrap()
}

如果连接未在 N 秒内完成,如何创建线程将被终止或杀死的情况?

所有这一切的原因是 Rust 无法设置套接字连接超时,所以我无法确保程序不会卡住。

最佳答案

正如@Shepmaster 指出的那样:终止线程不是一个好主意。

你可以做的是给线程一个 Sender如果它已成功打开连接,它应该通过它通知您(甚至可能通过向您发送句柄)。然后你可以让你的主线程sleep在你希望等待的时间。当您的线程醒来时,它会检查其对应的 Receiver从线程中获取一些生命迹象。万一线程没有回答,只是release it into the wild by dropping the JoinHandleReceiver。它不像是在消耗 cpu 时间(它被阻塞),也没有消耗太多内存。如果它解除阻止,它会检测到 Sender 未连接并且可以永久关闭。

当然,您不应该拥有数以亿计的这些开放线程,因为它们仍在使用资源(内存和系统线程句柄),但在普通系统上这不是什么大问题。

例子:

use std::net;
use std::thread;
use std::sync::mpsc;

fn scan_port(host: &str, port: u16) -> bool {
    let host = host.to_string();
    let port = port;
    let (sender, receiver) = mpsc::channel();
    let t = thread::spawn(move || {
        match sender.send(net::TcpStream::connect((host.as_str(), port))) {
            Ok(()) => {}, // everything good
            Err(_) => {}, // we have been released, don't panic
        }
    });

    thread::sleep(std::time::Duration::new(5, 0));

    match receiver.try_recv() {
        Ok(Ok(handle)) => true, // we have a connection
        Ok(Err(_)) => false, // connecting failed
        Err(mpsc::TryRecvError::Empty) => {
            drop(receiver);
            drop(t);
            // connecting took more than 5 seconds
            false
        },
        Err(mpsc::TryRecvError::Disconnected) => unreachable!(),
    }
}

关于multithreading - Rust 中为线程或函数创建超时的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181719/

相关文章:

c++ - 在 C/C++ 共享内存中等待和通知

rust - 是否有可能在不使用 Box 的情况下返回一个返回闭包的 Rust 闭包?

macros - 定义特征别名的宏

ubuntu - 为ARM编译时openssl无法编译,否则工作正常

rust - 如何创建一个参数数量可变的函数?

rust - 在 Rust 中子类化 gtk::Container 时处理子级

java - 创建线程与流程以更好地维护-设计方法

c# - 使用 SharedMemory MMF 实现快速 .NET 无锁进程间

javascript - Nodejs管理不同的线程

multithreading - 使用 angularJS 应用程序提高 Symfony2 的性能