如何解决在异步块中使用线程不安全值
在此代码段(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
发送到另一个线程,这是不允许的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。