对于接受函数并返回另一个返回线程句柄的函数,函数类型签名应该是什么?

Sam*_*ick 1 parallel-processing rust

我正在尝试编写一个函数parallelize,该函数将函数作为参数B并返回一个函数C,其中C返回一个正在运行的线程的句柄B.我明白这可能是笨重或荒谬的; 它主要是作为一个学习项目.更高级别的目标是在迭代器上实现并行映射函数,其中列表的每个元素将映射到不同的线程(或最终可能通过线程池).我很快就意识到我已经超越了我的头脑.鉴于我所描述的,这种类型应该parallelize是什么?

She*_*ter 7

让我们一步一步地介绍它:

一个功能 parallelize

fn parallelize() {
    unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)

是的,这是一个功能正常.

参数一个函数B.

我假设您希望函数能够返回一些东西,所以我将使用泛型类型R.

fn parallelize<B, R>(function: B)
where
    B: FnOnce() -> R,
{
    unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)

返回一个函数C.

哦,哦.你还不能在Rust中干净利落地做到这一点.这意味着我们会返回一个盒装特质的对象,而不是

fn parallelize<B, R>(function: B) -> Box<FnOnce()>
where
    B: FnOnce() -> R,
{
    unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)

其中C返回运行B的线程的句柄

use std::thread::JoinHandle;

fn parallelize<B, R>(function: B) -> Box<FnOnce() -> JoinHandle<R>>
where
    B: FnOnce() -> R,
{
    unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)

这是你的签名.都在这里完成!

.....

当然,还有更多工作要做.例如,您没有说明线程何时应该实际启动.这意味着我可以选择,我选择最简单的方法 - 当调用者请求句柄时启动线程.

use std::thread::{self, JoinHandle};

fn parallelize<B, R>(function: B) -> Box<FnOnce() -> JoinHandle<R>>
where
    B: Send + FnOnce() -> R + 'static,
    R: Send + 'static,
{
    Box::new(|| thread::spawn(function))
}
Run Code Online (Sandbox Code Playgroud)

我猜你也可以马上开始吧:

use std::thread::{self, JoinHandle};

fn parallelize<B, R>(function: B) -> Box<FnOnce() -> JoinHandle<R>>
where
    B: Send + FnOnce() -> R + 'static,
    R: Send + 'static,
{
    let handle = thread::spawn(function);
    Box::new(|| handle)
}
Run Code Online (Sandbox Code Playgroud)

我不知道你为什么要做第二个; 在这种情况下,你也可以直接返回句柄.如果你做的是,你可能也只是调用thread::spawn直接.

哦,我想我无法将那些额外的特质限制在你身边,是吗?在调用时thread::spawn,您必须确保在线程退出(因此'static)之前,您传递的任何内容都不会有效,并且可以安全地在线程之间进行传输(因此Send).

更高级别的目标是在迭代器上实现并行映射函数

这存在并被称为人造丝.


也可以看看:


归档时间:

查看次数:

54 次

最近记录:

8 年,2 月 前