新しい値を計算するためにベクトルの不変なリストを使用しているこの単純な例を考えてみましょう。 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> {
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);
}
}
は、プロセッサ集約関数であり、我々はこれを実行するために、複数のスレッドを使用したい場合があり、次の例は動作しますが、が必要です(私はと思われるもの:この作業、シングルスレッドの例を考えると
)は不要なベクタークローンです。
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
を呼び出すたびに新しいベクターを割り当てる必要はありません。
この単純な例は、クロージャに渡される前にデータを複製する必要なしに、どのようにマルチスレッド化できますか?
更新、それは所有権を取得する必要がないにもかかわらず、@のKERの提案に基づいてArc
を使用していますHERESにworking example。
注1)私はスレッドを処理するために、サードパーティのライブラリがある知っていますが、これは錆の標準ライブラリを使用して可能であるかどうかを知るために興味があります。
注2)スレッディングに関する同様の質問がありますが、例ではスレッドにデータを書き込むことがよくありますが、ここではそうではありません。
わからない、これは重複し、その確かに関連しているが、この質問を具体的に寿命に関係していません - ちょうど読み取り専用データの複製を避ける方法について説明します。 – ideasman42
クローニングしていないコードではそのエラーが発生しているはずですので、私はそれが重複していると思います。なぜなら、他の質問に対する回答は基本的にはこの質問と同じですからです。同じ回答については異なる質問をするのは大丈夫ですが、質問は私の意見では重複しています。私はしかし、stackoverflowのルールを誤解しているかもしれません。 –
ここで重要なのは、データが読み取り専用であり、データの複製が望ましくないコストを招く可能性があるということです。たとえば答えのポイントの1つは、データをコピーすることを示唆しています。私はエラーを避ける方法を尋ねていません、私は 'クローン'を避ける方法を尋ねています。 – ideasman42