2015-08-06 11 views
8

Voglio che il mio programma si blocchi praticamente sempre e la prima idea che avevo era:`threadDelay (maxBound :: Int)` inciampa in un bug di GHC o cosa?

threadDelay (maxBound :: Int) 

Questo ha dato alcuni avvisi spuri:

Prelude> import Control.Concurrent 
Prelude Control.Concurrent> threadDelay 10 
Prelude Control.Concurrent> threadDelay (maxBound :: Int) 
<interactive>: c_poll: invalid argument (Invalid argument) 
<interactive>: ioManagerWakeup: write: Bad file descriptor 

ho fatto di sbagliato o fatto GHC?

+1

Si tratta di 32 o 64 bit? – Cactus

+0

@Cactus OSX a 64 bit. –

risposta

8

Questo sembra essere un known GHC bug, con alcuni progressi compiuti (anche se non tutte le configurazioni sembrano essere già state riparate).

Nel frattempo, è possibile utilizzare forever (threadDelay (2^20)) o simile come soluzione alternativa; 2^20 dovrebbe essere abbastanza lontano da maxBound per evitare questo bug e svegliarsi una volta al secondo per alcuni cicli dovrebbe essere abbastanza facile sul sistema.

+0

Grazie. 'forever (threadDelay maxBound)' da quella segnalazione di bug è un'idea migliore della mia. –

+1

@MichaelFox Ho aggiornato la risposta con una proposta di soluzione alternativa. –

+0

Grazie. Farò esattamente questo. –