Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 锈蚀中的多螺纹记忆_Multithreading_Asynchronous_Rust - Fatal编程技术网

Multithreading 锈蚀中的多螺纹记忆

Multithreading 锈蚀中的多螺纹记忆,multithreading,asynchronous,rust,Multithreading,Asynchronous,Rust,我正在Rust中开发一个算法,我想实现多线程。该算法的本质是它产生了重叠子问题的解决方案,因此我正在寻找一种实现多线程记忆的方法 Pritchard在中介绍了(单线程)回忆录的实现 我希望扩展此功能,以便: 无论何时必须调用基础函数(包括递归调用),都会在新线程上异步计算结果 从上一点继续,假设我们有一些记忆函数f,和f(x),需要递归调用f(x1),f(x2),…f(xn)。所有这些递归调用都应该可以在单独的线程上并发计算 如果对当前正在计算结果的输入调用了memoised函数,则当前线程应在

我正在Rust中开发一个算法,我想实现多线程。该算法的本质是它产生了重叠子问题的解决方案,因此我正在寻找一种实现多线程记忆的方法

Pritchard在中介绍了(单线程)回忆录的实现

我希望扩展此功能,以便:

  • 无论何时必须调用基础函数(包括递归调用),都会在新线程上异步计算结果
  • 从上一点继续,假设我们有一些记忆函数
    f
    ,和
    f(x)
    ,需要递归调用
    f(x1)
    f(x2)
    ,…
    f(xn)
    。所有这些递归调用都应该可以在单独的线程上并发计算
  • 如果对当前正在计算结果的输入调用了memoised函数,则当前线程应在此线程上阻塞,并在释放后以某种方式获得结果。这确保了我们不会有多个线程试图计算相同的结果
  • 有一种方法可以强制计算和缓存
    f(x)
    (如果还没有),而不阻塞当前线程。这允许程序员先发制人地开始对一个他们知道以后需要(或可能需要)的特定值的结果进行评估

  • 一种方法是存储一个
    HashMap
    ,其中键是
    f
    的参数,值是包含结果的一次性消息的接收者。然后,对于您需要的任何值:

    • 如果地图上已经有接收器,等待它
    • 否则,生成一个future来开始计算结果,并将接收器存储在地图中
    下面是一个非常做作的示例,它花费的时间比它应该花费的时间长,但成功地运行了():

    使用未来:{
    未来:{self,BoxFuture},
    序曲::*,
    准备好的
    };
    使用std::{
    集合::HashMap,
    pin::pin,
    sync::Arc,
    任务::{Context,Poll},
    };
    使用tokio::sync::{oneshot,Mutex};
    #[派生(克隆、调试、Eq、哈希、PartialEq)]
    结构输入(usize);
    #[派生(克隆、调试、Eq、哈希、PartialEq)]
    结构内存返回(usize);
    ///这是为“HashMap”创建具体类型所必需的。
    结构OneShotReceiveUnwrap(oneshot::Receiver);
    OneshotReceiverUnwrap的impl未来{
    类型输出=T;
    
    fn民意测验(mut self:Pin、cx:&mut Context boxfuture请提供一个示例。您尝试了什么,出了什么问题?听起来很复杂,因为数据共享的开销,您可能会完全放弃并行性的好处。为什么您认为这应该是并行的?生成一个新线程并立即阻止它有什么意义?并行性的要点是在等待另一个线程的工作结果时继续处理其他线程。当这个递归函数在等待计算
    n-1
    th值时,它能做多少工作?@Coder-256在我的问题中我可能没有足够清楚地说明这一点,但是这个递归函数有很多广度递归调用以及深度。我不知道Rust中的等价物是什么,但想象一下在JavaScript中,
    f(x)
    调用
    Promise.all([f(x1),f(x2),…f(xn)])