问题描述
在此代码段(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 }}值,但是在此示例中,我要发送给另一个线程的唯一内容是Send
和recv
。我如何表达将来仅在发送后才应切换到非线程安全模式?
send2
解决方法
但是在此示例中,我要发送给另一个线程的唯一内容是
recv
和send2
还有thread_unsafe
中使用的局部变量.await
。由于.await
可以暂停异步功能,然后在另一个线程上恢复它,因此这可能会将thread_unsafe
发送到另一个线程,这是不允许的。