Rust 将线程池引用传递到线程池作业中

问题描述 投票:0回答:1

我正在尝试将作业添加到线程池,该线程池还必须能够将作业添加到该线程池。

我是 Rust 新手。

我试图用它来将函数作为作业传递给线程池。该函数需要能够多次调用自身(可能会更改参数,但我省略了它们),因此可以使用所有线程,它需要将这些后续函数调用作为作业添加到线程池中。我尝试了很多方法,但我不知道如何将线程池的引用传递到作业中。

示例:

use num_cpus;
use threadpool::ThreadPool;

fn func2(pool: &ThreadPool) {
    pool.execute(|| func2(&pool))
}

fn func1() {
    let pool = ThreadPool::new(num_cpus::get());

    pool.execute(|| func2(&pool));

    pool.join();
}
multithreading rust parallel-processing threadpool
1个回答
0
投票

您可以将线程池放置在 Arc 中,并将克隆的 arc 传递给函数:

use threadpool::ThreadPool;
use std::sync::Arc;

fn func2(pool: &Arc<ThreadPool>) {
    let pool_new_ref = Arc::clone(&pool);
    pool.execute(move || func2(&pool_new_ref))
}

fn func1() {
    let pool = Arc::new(ThreadPool::new(num_cpus::get()));
    let pool_new_ref = Arc::clone(&pool);
    pool.execute(move || func2(&pool_new_ref));
    pool.join();
}

游乐场

请注意,如所写,此代码执行无限循环,

func2()
通过线程池尾递归调用自身。

© www.soinside.com 2019 - 2024. All rights reserved.