不是!Send不能穿越await,而是!Send的状态跨过await,会使得async fn变成!Send。
一个async fn是!Send本身没有任何问题,只是不满足tokio::spawn的要求。
就Rc而言,的确理论上可以在不同线程间传递,只要保证不同时访问即可。
但这种运行时行为,编译器很难去证明。所以编译器完全禁止!Send传出当前线程。
另一方面,你既然用Rc,本身就说明它不太可能“只有一个owner”,否则用普通变量就行了。在真实的代码(而不是这种例子)中,用了Rc,一般来说它就会被传出当前async fn。
【 在 txgx 的大作中提到: 】
: 大概是明白了,rust担心rc被其他人使用,所以用规则一棍子打死。
: !send的不能穿越await
: 就是懒政。
: ...................
--
FROM 58.37.58.*