< 返回版块

LongRiver 发表于 2023-09-10 14:38

我希望声明一个全局的Sender。

使用Tokio的mpsc时,是可以的。 但会用标准库里的mpsc时,就会报错,说Sender没有实现Sync。

代码如下:

use once_cell::sync::OnceCell;

static TX_TOKIO: OnceCell<tokio::sync::mpsc::Sender<usize>> = OnceCell::new(); // 正确

static TX_STD: OnceCell<std::sync::mpsc::Sender<usize>> = OnceCell::new();  // 错误!

fn main() {
    println!("Hello, world!");
}

报错如下:

error[E0277]: `std::sync::mpsc::Sender<usize>` cannot be shared between threads safely
 --> src/main.rs:5:16
  |
5 | static TX_STD: OnceCell<std::sync::mpsc::Sender<usize>> = OnceCell::new();
  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `std::sync::mpsc::Sender<usize>` cannot be shared between threads safely
  |
  = help: the trait `Sync` is not implemented for `std::sync::mpsc::Sender<usize>`
  = note: required for `once_cell::imp::OnceCell<std::sync::mpsc::Sender<usize>>` to implement `Sync`
  = note: required because it appears within the type `OnceCell<Sender<usize>>`
  = note: shared static variables must have a type that implements `Sync`

我有两个问题:

  1. 我看标准库的文档里,Sender是实现了Sync的 。为什么这里还会报错呢?

  2. tokio的Sender跟标准库的Sender相比有什么区别呢?为什么就可以正常声明呢?

评论区

写评论
作者 LongRiver 2023-09-10 14:51

查了下,我的编译器是 1.69.0 的,我升级下版本试试。

没想到还能用上最新特性。赶了个潮流。

多谢两位。

NoReligion 2023-09-10 14:48

看你的编译器版本,旧版本文档可以看 https://doc.rust-lang.org/1.71.1/std/sync/mpsc/struct.Sender.html#impl-Sync-for-Sender%3CT%3E

viruscamp 2023-09-10 14:47

你的 rustc 版本是什么?
最新版本 8-24 的 1.72.0 rustc 才有这个。 8-3的 1.71.1 都没有的。

#[stable(feature = "mpsc_sender_sync", since = "1.72.0")]
unsafe impl<T: Send> Sync for Sender<T> {}
1 共 3 条评论, 1 页