#[async_std::main]
async fn main() -> io::Result<()> {
let mut coll = Vec::with_capacity(1000000);
for i in 0..1000000{
coll.push(String::from("xxxxxxxxxxxxxx"));
}
let chs = coll.chunks(50000);
let mut fus = Vec::new();
for ch in chs{
let f = spawn(async move{
println!("{}", ch.len());
});
fus.push(f);
}
for f in fus{
f.await
}
}
上面这版编译会报错
#[async_std::main]
async fn main() -> io::Result<()> {
let page = 50000;
let mut coll = Vec::with_capacity(1000000);
for _i in 0..1000000{
coll.push(String::from("xxxxxxxxxxxxxx"));
}
let mut fus = Vec::new();
let acoll = Arc::new(coll);
let chs = acoll.chunks(50000);
for i in 0..chs.len(){
let c_acoll = acoll.clone();
let f = spawn(async move{
println!("{}", c_acoll[i*page..(i+1)*page].len());
});
fus.push(f);
}
for f in fus{
f.await;
}
}
这里有什么更好的写法吗? spawn里面标记了边界'static,有种情况是不是只要是move进去的对象里面有借用的数据并且不是static生命周期的,那都没办法编译
比如:
struct Hi<'a>{
a:&'a String
}
这种实例对象就没办法move进去了,这样写起来感觉好难
1
共 5 条评论, 1 页
评论区
写评论在main可以直接leak或者transmute一下生命周期。 但实际代码中不会是那么简单就在main里spawn一下。你很可能要在spawn中spawn,这时候借用就不是那么简单了。
你把所有的futures都收集起来了,然后await
上面是从你代码里摘取的,大体意思是: 如果有async fn没有执行完,async main函数就会一直block,并不会立即执行完. 所以不会出现UAF漏洞
--
👇
mu0641: 这样写会有安全问题吧,如果main运行到底部,引用的数据已被释放,但是异步的线程还在执行
这样写会有安全问题吧,如果main运行到底部,引用的数据已被释放,但是异步的线程还在执行
--
👇
ooopSnake: 办法有,不过得请出unsafe
这样写会有安全问题吧,如果main运行到底部,引用的数据已被释放,但是异步的线程还在执行
--
👇
ooopSnake: 办法有,不过得请出unsafe
办法有,不过得请出unsafe