我正在尝试将作业添加到线程池,该线程池还必须能够将作业添加到该线程池。
我是 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();
}
您可以将线程池放置在 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()
通过线程池尾递归调用自身。