Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

177
Visualizações
¿Los canales de Kotlin utilizados en las corrutinas son seguros para subprocesos/sincronizados/mantienen la relación antes de que suceda?

¿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ó)?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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

over 4 years ago · Santiago Trujillo Relatório

0

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ó)?

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.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda