相关疑难解决方法(0)

如何将对堆栈变量的引用传递给线程?

我正在编写一个WebSocket服务器,其中一个Web客户端连接到多线程计算机AI上下棋.WebSocket服务器想要将Logger对象传递给AI代码.该Logger对象将管理从AI到Web客户端的日志行.在Logger必须包含对客户端连接的参考.

我对生命周期如何与线程交互感到困惑.我用Wrapper类型参数化的结构重现了这个问题.该run_thread函数尝试解包该值并记录它.

use std::fmt::Debug;
use std::thread;

struct Wrapper<T: Debug> {
    val: T,
}

fn run_thread<T: Debug>(wrapper: Wrapper<T>) {
    let thr = thread::spawn(move || {
        println!("{:?}", wrapper.val);
    });

    thr.join();
}

fn main() {
    run_thread(Wrapper::<i32> { val: -1 });
}
Run Code Online (Sandbox Code Playgroud)

wrapper参数存在于堆栈中,并且它的生命周期不会延伸超过run_thread堆栈帧,即使该线程将在堆栈帧结束之前连接.我可以从堆栈中复制值:

use std::fmt::Debug;
use std::thread;

struct Wrapper<T: Debug + Send> {
    val: T,
}

fn run_thread<T: Debug + Send + 'static>(wrapper: Wrapper<T>) {
    let thr = thread::spawn(move || …
Run Code Online (Sandbox Code Playgroud)

rust

22
推荐指数
1
解决办法
3771
查看次数

如何在 Rust 中竞赛期货集合?

给定一个Futures的集合,比如说 a Vec<impl Future<..>>,我怎样才能同时阻塞和运行所有的Futures 直到第一个Future准备好?

我能找到的最接近的功能是select 宏(也可以在 Tokio 中使用)。不幸的是,它只适用于明确数量的Futures,而不是处理它们的集合。

Javascript 中有一个与此功能等效的功能,称为Promise.race。有没有办法在 Rust 中做到这一点?

或者也许有一种方法可以使用另一种模式(也许是通道)来实现此用例?

concurrency asynchronous future rust

5
推荐指数
1
解决办法
874
查看次数

标签 统计

rust ×2

asynchronous ×1

concurrency ×1

future ×1