Ho un programma che utilizza diversi thread. A quanto ho capito, quando il thread 0 termina, l'intero programma si chiude, indipendentemente da altri thread che potrebbero ancora essere in esecuzione.Qual è il modo migliore per uscire da un programma Haskell?
Il problema è che questi altri thread potrebbero avere file aperti. Naturalmente, questo è incluso nel codice di gestione delle eccezioni che chiude in modo pulito i file in caso di problemi. Ciò significa anche che se utilizzo killThread
(che è implementato tramite throwTo
), il file dovrebbe anche essere chiuso prima che il thread esca.
La mia domanda è, se ho appena lasciato che il thread 0 esca, senza tentare di fermare gli altri thread, tutti i vari handle di file saranno chiusi bene? L'output bufferizzato viene scaricato?
In breve, posso uscire o devo prima eliminare manualmente i thread?
Preferisco non fare affidamento su 'killThread' o' exit' per pulire altri thread solo per una buona igiene di programmazione. Io strumento tutti i miei thread per ascoltare i segnali di pulizia dal thread principale in modo che possano essere tutti chiusi con grazia. –
Perché non provarlo? IME, la maggior parte dei sistemi operativi chiuderà i file, ovvero non lascerà alcun handle, fd o altre perdite, ma l'I/O in sospeso non verrà scaricato. –
@GabrielGonzalez Se lo fai in questo modo, significa che un thread terminerà solo in determinati punti.Se ti dimentichi di controllare regolarmente abbastanza, o qualcosa richiede più tempo del previsto, puoi ottenere una situazione in cui segnali il thread di morire, e non lo fa (o richiede solo molto tempo). Devi comunque gestire le eccezioni, quindi perché non usare 'killThread'? – MathematicalOrchid