Saltar al contenido

Qué solo ocurre en el hilo principal

Los sistemas operativos exigen que la interfaz se toque desde un hilo concreto, y cada uno lo exige de forma distinta. Qué está atado, por qué, y cómo se manifiesta cuando lo incumples.

Qué está atado

Por qué

Las tres razones son distintas y conviene conocerlas porque explican los síntomas:

En macOS es una regla del sistema. El conjunto de herramientas gráficas de Apple no es seguro para usar desde varios hilos y comprueba activamente que las llamadas de interfaz vengan del principal. Cuando no, avisa o falla de forma ruidosa. Es la plataforma más estricta y, paradójicamente, la más agradable: te lo dice.

En Windows es la afinidad de la ventana. Cada ventana pertenece al hilo que la creó, porque su cola de mensajes vive ahí. Tocarla desde otro hilo no siempre falla: a veces funciona, a veces se cuelga, y a veces produce comportamientos raros según el mensaje concreto. Esa impredecibilidad es lo que la hace peor que la regla estricta de macOS.

En Linux es que el conjunto de herramientas no es seguro entre hilos. No comprueba nada. Llamar desde otro hilo puede funcionar cien veces y corromper el estado interno la ciento uno, con un fallo que aparece mucho después y en otro sitio.

De las tres, la de macOS es la que te salva porque avisa; las otras dos permiten escribir código incorrecto que parece funcionar.

Los tres síntomas

Un aviso o un fallo inmediato. El caso bueno, y casi siempre en macOS. El mensaje suele mencionar el hilo principal explícitamente.

Un cuelgue. La operación se queda esperando algo que solo el hilo principal puede darle, y ese hilo está esperando a la operación. Es un interbloqueo entre tu tarea y el bucle de eventos.

Nada, y un fallo raro más tarde. El peor, y el habitual en Linux: la llamada parece funcionar, el estado interno del conjunto de herramientas queda inconsistente, y algo se rompe minutos después de una forma que no señala a la causa.

La consecuencia práctica: no confíes en que funcione porque funcionó. Si tocas la interfaz desde una tarea y no revienta, puede que solo estés en el tercer caso.

Qué NO está atado

Y esta es la buena noticia, porque es la mayor parte del trabajo:

  • Todo el trabajo del core. Leer ficheros, consultar la base, hablar con la red, calcular, cifrar. Nada de eso toca la interfaz.
  • Emitir eventos. Se pueden emitir desde cualquier hilo; el framework se encarga de entregarlos.
  • Leer el estado, tomar cerrojos, mandar mensajes por un canal.
  • Mandar por un canal a la webview, que es el nivel 21.2.

Es decir: una tarea de fondo bien diseñada casi nunca necesita el hilo principal. Si tu tarea lo necesita a menudo, probablemente está haciendo trabajo de interfaz que debería hacer el frontend.