- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我决定深入研究 Kotlin 协程。我有一些关于可见性的问题。我知道在没有 ContinuationInterceptor
的情况下,相同协程的不同部分可能会由不同的线程执行。
如何保证在挂起后,新线程对协程内部状态具有正确的可见性?
例如:
suspend fun doPost(customRatings : Map<String, Int>) : Int {...}
fun postRatings_1() {
GlobalScope.launch {
val mutableMap : MutableMap<String, Int> = mutableMapOf()
mutableMap["Apple"] = 1
mutableMap["Banana"] = 2
// ...
val postId = doPost(mutableMap)
// How am I guaranteed to see the two entries here ?
println("posted ${mutableMap} with id ${postId}")
}
}
启动新协程时类似
fun postRatings_2() {
val mutableMap : MutableMap<String, Int> = mutableMapOf()
mutableMap["Apple"] = 1
mutableMap["Banana"] = 2
GlobalScope.launch {
// How am I guaranteed to see the two entries here ?
val postId = doPost(mutableMap)
//...
}
在这两种情况下,两个(现有)线程之间共享一些可变状态。
我正在寻找“Happens-before”规则,以保证可变状态将被两个线程正确可见。
最佳答案
I am looking for the "Happens-before" rule that guarantees that the mutable state will be properly visible by the two threads.
保证很容易获得:例如,如果您的调度程序基于 Java 线程池,则线程池本身已经提供了此保证。 executor.submit()
调用 happens-before 提交的代码,而该代码又happens-before观察相关 future 的完成。
即使您使用名为 Dispatchers.Unconfined
的 null-dispatcher,它只是在您碰巧调用 continuation.resume(result)
的任何线程上恢复协程,你仍然得到 happens-before 因为调用你的回调的底层框架保证了它。
您必须编写一个自定义的损坏的 Dispatcher
实现来打乱顺序。
关于multithreading - Kotlin 协程中的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58901729/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!