c语言线程超时函数,多线程 – Rust为线程或函数创建超时的正确方法是什么?...

正如@Shepmaster所说:终止线程是个坏主意.

你可以做的是给线程一个Sender,如果它已成功打开一个连接(甚至可能通过发送你的句柄)它应该通知你.然后你可以让你的主线程sleep等待你想要的时间.当你的线程被唤醒时,它会从线程中检查其对应的Receiver以查找生命迹象.如果线程没有回答,只需release it into the wild by dropping the JoinHandle和接收器.它不像消耗cpu时间(它被阻止),而且它不会消耗太多内存.如果它解锁,它将检测到发送者没有连接并且可以关闭.

当然你不应该有这些开放线程的bazillions,因为它们仍然使用资源(内存和系统线程句柄),但在正常的系统上,这不是一个问题.

例:

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!(),}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值