gpt4 book ai didi

multithreading - mpsc::Sender> 和线程的 Rust 生命周期

转载 作者:行者123 更新时间:2023-11-29 07:51:26 25 4
gpt4 key购买 nike

我正在创建一个多线程应用程序,我在其中创建了一个接收 channel 和一个用于保存发送 channel 的结构(稍后由实现使用)。但是,我通过 channel 发送的类型具有生命周期规范。这种类型是 websocket::message:Message来自 rusts-weboscket 库。由于此规范,当 Rust 通过线程传递时,它似乎无法正确推断生命周期。

这是此错误的 Rust Playground 示例: https://play.rust-lang.org/?gist=7e37547d1c811185654f10a6a461e1ef&version=stable&backtrace=1

现在,我尝试使用 crossbeam 确定生命周期范围,这似乎解决了眼前的问题,但实际上只是将生命周期规范问题委托(delegate)给其他地方。

在我的代码中出现错误:

   $ cargo check
Compiling rump v0.1.0 (file:///home/alainh/UPenn/CIS198/Rump)
transport.rs:200:42: 200:57 error: cannot infer an appropriate lifetime for autoref due to conflicting requirements [E0495]
transport.rs:200 self.sender.send(self.serializer.encode(message));
^~~~~~~~~~~~~~~
transport.rs:199:5: 202:6 help: consider using an explicit lifetime parameter as shown: fn send<T: Encodable>(&'a mut self, message: &T) -> WampResult<()>
transport.rs:199 fn send<T: Encodable>(&mut self, message: &T) -> WampResult<()> {
transport.rs:200 self.sender.send(self.serializer.encode(message));
transport.rs:201 Ok(())
transport.rs:202 }
error: aborting due to previous error
Could not compile `rump`.

有问题的行是这一行: https://github.com/aehernandez/Rump/blob/ad717c7ef11857e94d0e1c02539667c8034676c4/src/transport.rs#L199

在这一点上,我不确定如何准确解决这个生命周期问题。我不想继续将它委托(delegate)给其他地方。有好的解决办法吗?

最佳答案

当您生成一个线程时,它可能永远存在;肯定比你的Transport<'a>长寿任何生命周期的类型'a除了'static (虽然错误消息非常困惑)。当您调用 thread::spawn对于闭包,该闭包必须具有 'static生命周期,只有在 'a == 'static 时才为真.

由于您实际上并没有通过 channel 发送具有生命周期的对象,因此请考虑使用 'static生命周期明确:

impl Connector for Transport<'static> {
...
}

Playpen

编辑:

手动注释发送方和接收方的类型

    let (tx, rx): (mpsc::Sender<Message<'a>>, mpsc::Receiver<Message<'a>>) = mpsc::channel();
let tx_send: mpsc::Sender<Message<'a>> = tx.clone();

显示一个更明智的错误

<anon>:27:22: 27:35 error: the type `[closure@<anon>:27:36: 29:10 tx_send:std::sync::mpsc::Sender<Message<'a>>]` does not fulfill the required lifetime [E0477]
<anon>:27 let handle = thread::spawn(move || {
^~~~~~~~~~~~~
note: type must outlive the static lifetime
error: aborting due to previous error
playpen: application terminated with error code 101

Playpen

关于multithreading - mpsc::Sender<T<'a>> 和线程的 Rust 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36511332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com