gpt4 book ai didi

multithreading - 将带有引用的迭代器移到线程中

转载 作者:行者123 更新时间:2023-12-03 11:31:14 24 4
gpt4 key购买 nike

我有一个代表文件的类型。为了简单起见,可以说类型保存一个包含文件内容的缓冲区。
还有一种用于构建迭代器的方法,该迭代器保存对内部缓冲区的引用。
文件类型是在主线程上创建的,但是我需要将迭代器“发送”到线程中。
让我展示我要做什么

struct FileType {...}

let mut my_file_type = FileType::new("some_filename");
let mut my_iterator = my_file_type.iter();

external_library_object.start_process(move|_| {
for _ in (0..10) {
println!(my_iterator.next().unwrap());
}
}
external_library_object(顺便说一句是cpal的设备)是...我无法更改的库中的对象。闭包参数虽然实现了发送特征。
这是行不通的,因为 my_file_type的生命周期不足。
所以我尝试了Mutex(这样迭代器是可变的)和Arc(所以我们在2个线程之间共享迭代器)的组合
...

let mut my_file_type = FileType::new("some_filename");
let mut my_iterator = Arc::new(Mutex::new(my_file_type.iter()));

external_library_object.start_process(move|_| {
let mut cloned = my_iterator.clone();
for _ in (0..10) {
println!(cloned.lock().unwrap().next().unwrap());
}
}
但是再次,这是行不通的。我收到类似以下错误:
xx |     let mut my_iterator = Arc::new(Mutex::new(my_file_type.iter()));
| ^^^^^^^^^^^^-------
| |
| borrowed value does not live long enough
| argument requires that `my_file_type` is borrowed for `'static`
...
xx | }
| - `my_file_type` dropped here while still borrowed
我有点卡在这里。有没有办法使用迭代器,该迭代器在另一个线程内具有对其他对象(在这种情况下为缓冲区)的引用?
编辑:在我的特定情况下,迭代器是无限的,并且闭包执行多次。这就是我无法在线程内移动整个FileType的原因。

最佳答案

这很棘手,因为进程借用了迭代器,而迭代器又借用了结构。仅将迭代器放到Arc<Mutex<>>中是不够的,因为此指针可能仍然比借用的FileType生命周期更长。但是,我们不能将FileType和迭代器都放入引用计数结构中,因为该结构将是自引用的。
我可以想到的最简单的解决方案(不使用scoped threads)是创建一个拥有FileType的迭代器,然后将其放入Arc<Mutex<>>(minimal playground example):

let my_file_type = FileType::new("test!");
let my_iterator = Arc::new(Mutex::new(my_file_type.into_iter()));

external_library_object.start_process(move |_| {
for _ in 0..10 {
println!("{:?}", my_iterator.lock().unwrap().next().unwrap());
}
});
您只需为自己的 FileType结构实现一个拥有的迭代器(如果尚不存在)。

关于multithreading - 将带有引用的迭代器移到线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65535313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com