Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/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
Rust 数据互斥带来的生锈寿命问题_Rust - Fatal编程技术网

Rust 数据互斥带来的生锈寿命问题

Rust 数据互斥带来的生锈寿命问题,rust,Rust,我已经尽可能缩小了范围。我有一个指向发送者的引用向量,希望在receive()完成运行后处理它们。然而,我遇到了一个终身管理问题。内部结构受Mutex保护,并包含我试图引用的发送者。我使用互斥来获得数据的可变性,我愿意接受其他选择。对如何解决这个问题有什么建议吗?我不想更改receive()的签名 使用std::sync::Mutex; 使用std::sync::mpsc; #[衍生(默认)] 结构SaveForLater, } 恳求{ fn发送(&mut self,通道:&'a mpsc::S

我已经尽可能缩小了范围。我有一个指向
发送者的引用向量
,希望在
receive()
完成运行后处理它们。然而,我遇到了一个终身管理问题。内部结构受
Mutex
保护,并包含我试图引用的
发送者。我使用互斥来获得数据的可变性,我愿意接受其他选择。对如何解决这个问题有什么建议吗?我不想更改receive()的签名

使用std::sync::Mutex;
使用std::sync::mpsc;
#[衍生(默认)]
结构SaveForLater,
}
恳求{
fn发送(&mut self,通道:&'a mpsc::Sender,值:usize){
self.queue.push((通道,值));
}
}
#[衍生(默认)]
结构转发器{
数据:互斥锁,
}
#[衍生(默认)]
结构转发数据{
发件人:Vec,
}
impl转发器{
fn带_容量(容量:usize)->Self{
让mut senders=Vec::new();
对于0.容量中的uu{
设(s,r)=mpsc::channel();
发送者。推送;
}
让data=ForwarderData{senders};
让data=Mutex::new(数据);
自{data}
}

fn receive(&'a self,value:usize,sender:&mut SaveForLater
Mutex
在这里是一种干扰;真正的问题是试图在结构中存储引用。让我们看看的文档,看看它应该如何使用:

Rust异步类型的发送一半。这一半只能由一个线程拥有,但可以克隆它以发送到其他线程

Sender
甚至不执行
Sync
,因此即使您让借阅检查程序满意,它也意味着要被克隆

struct SaveForLater {
    queue: Vec<(mpsc::Sender<usize>, usize)>,
}
。不需要使用寿命参数


一般来说,您应该避免将引用放在结构中,因为只有在编译时非常努力地证明生存期关系时,才能安全地进行引用。在大多数情况下,您应该简单地克隆数据,或者如果这是错误的语义,请使用
Arc
Rc
mpsc::Sender
使用
Arc
在内部,克隆成本很低。

我使用mpsc::Sender作为简化。实际代码使用smol::channel::Sender,我希望避免克隆()的开销,Arc或Sender。借用检查器基本上执行静态生存期分析,并且您的数据具有无法静态分析的生存期,因为它们取决于运行时行为。如果您不打算将所有
发送者
存储在竞技场中,或预填充的
Vec
或其他东西(这意味着它们会同时被销毁),您需要某种运行时检查(或者您可以泄漏内存)。如果需要的话,这不会增加开销。啊,是的,就是这样——它做静态生命周期分析,当然我看了看,说它很好,但这只是因为我在看代码结构和使用情况,基本上是在做运行时分析。谢谢你让我直截了当。没错!是的,我认为Rust编译器有时看起来足够神奇,我们可以当被问到它拒绝执行文字魔术时,它可能会感到失望。无论如何,这在我身上发生过多次。所以,这是固定的…现在我只需要找出如何从存储在HashMap中的Any中恢复具体类型:(
struct SaveForLater {
    queue: Vec<(mpsc::Sender<usize>, usize)>,
}
    fn receive(&self, value: usize, sender: &mut SaveForLater) {
        // ...
                sender.send(data.senders[0].clone(), value);
                //                         ^^^^^^^^