在异步块中使用线程不安全值

问题描述

在此代码段(playground link)中,我们在两个线程之间进行了一些简单的通信。主线程(执行第二个async块)向2块中的线程2发送async move到线程2,线程2接收它,添加自己的值,并将结果通过另一个通道发送回到主线程,该线程将显示该值。

线程2包含一些局部状态thread_unsafe变量,既不是Send也不是Sync,并且在.await上维护。因此,我们正在创建的impl Future对象本身既不是Send也不是Sync,因此对pool.spawn_ok调用一个编译错误

但是,这似乎应该没问题。我理解为什么spawn_ok()不能接受不是Send的未来,并且我也理解为什么将异步块编译为状态机会导致包含非{{1 }}值,但是在此示例中,我要发送给另一个线程的唯一内容Sendrecv。我如何表达将来仅在发送后才应切换到非线程安全模式?

send2

解决方法

但是在此示例中,我要发送给另一个线程的唯一内容是recvsend2

还有thread_unsafe中使用的局部变量.await。由于.await可以暂停异步功能,然后在另一个线程上恢复它,因此这可能会将thread_unsafe发送到另一个线程,这是不允许的。