使用mpsc生成生命周期::发件人<t <'a>&gt;和线程

时间:2016-04-09 00:24:13

标签: multithreading rust

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

这是这个错误的生锈操场示例: https://play.rust-lang.org/?gist=7e37547d1c811185654f10a6a461e1ef&version=stable&backtrace=1

现在,我尝试使用crossbeam来规范生命周期,这似乎解决了这个直接的问题,但实际上只是委托其他地方的生命周期规范问题。

在我的代码中,我收到错误:

   $ 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

此时我不确定如何准确解决这个终身问题。我不想继续将其委托给其他地方。对此有一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

当你产生一个线程时,它可能永远存在;肯定比Transport<'a>以外的任何生命周期'a的{​​{1}}类型都快(但错误信息非常令人困惑)。当您使用闭包调用'static时,该闭包必须具有thread::spawn生命周期,仅当'static时才会生效。

由于您实际上并未在整个频道中发送具有生命周期的对象,请考虑明确使用'a == 'static生命周期:

'static

Playpen

编辑:

手动注释发件人和收件人的类型

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

显示更明智的错误

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

Playpen