gpt4 book ai didi

multithreading - 如何在不克隆的情况下对只读数据进行多线程函数调用?

转载 作者:行者123 更新时间:2023-11-29 08:35:25 24 4
gpt4 key购买 nike

<分区>

以这个简单的例子为例,我们使用不可变的向量列表来计算新值。

给定这个有效的单线程示例:

use std::collections::LinkedList;

fn calculate_vec(v: &Vec<i32>) -> i32 {
let mut result: i32 = 0;
for i in v {
result += *i;
}
return result;
}

fn calculate_from_list(list: &LinkedList<Vec<i32>>) -> LinkedList<i32> {
let mut result: LinkedList<i32> = LinkedList::new();
for v in list {
result.push_back(calculate_vec(v));
}
return result;
}

fn main() {
let mut list: LinkedList<Vec<i32>> = LinkedList::new();
// some arbitrary values
list.push_back(vec![0, -2, 3]);
list.push_back(vec![3, -4, 3]);
list.push_back(vec![7, -10, 6]);

let result = calculate_from_list(&list);
println!("Here's the result!");
for i in result {
println!("{}", i);
}
}

假设 calculate_vec 是一个处理器密集型函数,我们可能希望使用多个线程来运行它,下面的示例有效但需要(我认为是) 一个不必要的载体克隆。

use std::collections::LinkedList;

fn calculate_vec(v: &Vec<i32>) -> i32 {
let mut result: i32 = 0;
for i in v {
result += *i;
}
return result;
}

fn calculate_from_list(list: &LinkedList<Vec<i32>>) -> LinkedList<i32> {
use std::thread;
let mut result: LinkedList<i32> = LinkedList::new();
let mut join_handles = LinkedList::new();
for v in list {
let v_clone = v.clone(); // <-- how to avoid this clone?
join_handles.push_back(thread::spawn(move || calculate_vec(&v_clone)));
}
for j in join_handles {
result.push_back(j.join().unwrap());
}
return result;
}

fn main() {
let mut list: LinkedList<Vec<i32>> = LinkedList::new();
// some arbitrary values
list.push_back(vec![0, -2, 3]);
list.push_back(vec![3, -4, 3]);
list.push_back(vec![7, -10, 6]);

let result = calculate_from_list(&list);
println!("Here's the result!");
for i in result {
println!("{}", i);
}
}

此示例有效,但仅在克隆向量时有效,但是从逻辑上讲,我认为不需要这样做,因为向量是不可变的。

没有理由每次调用 calculate_vec 都需要分配一个新向量。

这个简单的示例如何成为多线程的,而不需要在将数据传递给闭包之前克隆数据?


更新,这里是一个working example根据@ker 的建议使用 Arc,尽管它确实需要取得所有权。


注意 1) 我知道有第 3 方库可以处理线程,但我想知道这是否可以使用 Rust 的标准库。

注意 2)关于线程有很多类似的问题,但示例通常涉及线程写入数据,这里不是这种情况。

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