スポンサーリンク

Rustでthreadpoolクレートでスレッドプールを使う

Rustでスレッドプールを使う場合、threadpoolクレートが有名らしい。

https://crates.io/crates/threadpool

使用例

[dependencies]
threadpool = "1.8.1"
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()と併用してみる

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);
    }
 

}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: