相关疑难解决方法(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
查看次数

如何将只读数据发送到其他线程而不进行复制?

我正在尝试将只读数据的“视图”发送到另一个线程进行处理。基本上主线程确实工作,不断更新一组数据。每当发生更新时,主线程应该将更新的数据发送到其他线程,在那里它们将以只读方式处理它。我不想复制数据,因为它可能非常大。(无论如何,主线程还在内存中保留数据的“缓存”。)

我可以用 来实现这一点Arc<RwLock<T>>,其中T是我的数据结构。

但是,没有什么可以阻止侧线程更新数据。侧线程可以简单地调用lock()和写入数据。

我的问题是,是否存在类似于RwLock它的所有者/创建者具有唯一写入访问权限,但所有其他实例都具有只读访问权限的情况?这样,我将在编译时检查可能通过侧线程意外更新数据而发生的任何逻辑错误。

关于这些问题:

上述问题建议用Arc<Mutex<T>>or来解决Arc<RwLock<T>>,这都可以。但它仍然不能只执行一个编写者的编译时操作。

另外:crossbeamorrayon的作用域线程在这里没有帮助,因为我希望我的副线程比我的主线程寿命更长。

multithreading rust

10
推荐指数
1
解决办法
3120
查看次数

标签 统计

rust ×2

multithreading ×1