我希望声明一个全局的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`
我有两个问题:
-
我看标准库的文档里,Sender是实现了Sync的 。为什么这里还会报错呢?
-
tokio的Sender跟标准库的Sender相比有什么区别呢?为什么就可以正常声明呢?
1
共 3 条评论, 1 页
评论区
写评论查了下,我的编译器是 1.69.0 的,我升级下版本试试。
没想到还能用上最新特性。赶了个潮流。
多谢两位。
看你的编译器版本,旧版本文档可以看 https://doc.rust-lang.org/1.71.1/std/sync/mpsc/struct.Sender.html#impl-Sync-for-Sender%3CT%3E
你的 rustc 版本是什么?
最新版本 8-24 的 1.72.0 rustc 才有这个。 8-3的 1.71.1 都没有的。