我正在编写一个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 ×1