¿Las funciones disponibles en los canales de Kotlin son seguras para subprocesos? p.ej
val channel = Channel<Boolean>() val job1 = GlobalScope.launch { channel.send(true) } val job2 = GlobalScope.launch { val x = channel.poll() } Si en el código anterior, la job1 ejecutó el trabajo 1 (en tiempo real) antes de que se job2 el trabajo 2 y en diferentes subprocesos, ¿está garantizado que x se establece en true ? ¿O es posible que se configure con null (porque la memoria caché de la CPU no se actualizó)?
La biblioteca de clase de Channel kotlinx.coroutines es segura para subprocesos. Está diseñado para soportar múltiples subprocesos.
GlobalScope.launch puede no significar necesariamente que se ejecutará una corrutina en un nuevo subproceso
Si en el código anterior, la
job1ejecutó el trabajo 1 (en tiempo real) antes de que sejob2el trabajo 2 y en diferentes subprocesos, ¿está garantizado quexse establece entrue? ¿O es posible que se configure connull(porque la memoria caché de la CPU no se actualizó)?
El modelo de memoria de Java no tiene noción de tiempo y no garantiza nada simplemente basándose en el hecho de que una línea se ejecutó antes que otra. Ni siquiera puede determinar cuándo se ejecutó una acción en una CPU.
En el código que publicaste, hay dos rutinas que se ejecutan simultáneamente. Si, y solo si channel.poll() obtiene un valor no nulo, hay un borde que sucede antes de send() a poll() . Si obtiene un valor nulo, no hay borde antes de que suceda .
Digamos que determina la hora del reloj de pared en las dos rutinas, algo como lo siguiente:
var sendTime: Long = 0 var receiveTime: Long = 0 suspend fun main() { val channel = Channel<Boolean>(UNLIMITED) val job1 = GlobalScope.launch { channel.send(true) sendTime = System.nanoTime() } val job2 = GlobalScope.launch { receiveTime = System.nanoTime() val x = channel.poll() println(x) } job1.join() job2.join() println("${receiveTime - sendTime}") } El hecho de que el tiempo de receiveTime sea mayor que el tiempo de sendTime no induce una relación anterior y no fuerza a channel.poll() a observar el elemento enviado. Llamar nanoTime() no es una acción de sincronización.
Tenga en cuenta que estos hechos no tienen nada que ver con Kotlin o coroutines específicamente, así es como funciona el modelo de memoria de Java. Si estudia el modelo de memoria de C++, encontrará que funciona de la misma manera.