Rustでスレッドプールを使う場合、threadpoolクレートが有名らしい。
https://crates.io/crates/threadpool
use threadpool::ThreadPool; fn main() { // スレッドを四枚作成 let pool = threadpool::ThreadPool::new(4); // テスト用データ let myarray = std::sync::Arc::new(std::sync::Mutex::new(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9])); for i in 0..10{ // myarrayは参照なので、cloneして参照を複製する // クロージャに渡すmoveキーワードによって、myarray2がクロージャにムーブされる let array2 = myarray.clone(); // スレッドプールにジョブを追加 pool.execute(move || {
let mut data = array2.lock().unwrap(); data[i] *= 2;
} ); } // スレッドの終了を待つ pool.join(); // 結果を表示 let data = myarray.lock().unwrap(); println!("{:?}", data); }
channel()を使って各ジョブの結果を送信できる。
use threadpool::ThreadPool; // チャンネルを使うために必要 use std::sync::mpsc::channel; fn main() { // スレッドを四枚作成 let pool = threadpool::ThreadPool::new(4); // スレッドで処理した結果を受け取るためのチャンネルを作成 let (sender,receiver) = channel::<i32>(); // テスト用データ let myarray = std::sync::Arc::new(std::sync::Mutex::new(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9])); for i in 0..10{ // myarrayは参照なので、cloneして参照を複製する // クロージャに渡すmoveキーワードによって、myarray2がクロージャにムーブされる let array2 = myarray.clone(); let sender2 = sender.clone(); // スレッドプールにジョブを追加 pool.execute(move || { let mut data = array2.lock().unwrap(); data[i] *= 2; sender2.send(data[i]*10).unwrap(); // このジョブの結果をチャンネルに送信 } ); } // スレッドの終了を待つ pool.join(); // 全ての処理が終わったら、チャンネルを閉じる drop(sender); // チャンネルから結果を受け取る for itr in receiver.iter(){ print!("{} ", &itr); } }