2015-08-06 8 views
8

Chcę, aby mój program w zasadzie lockup zawsze i pierwszy pomysł miałam:Czy `threadDelay (maxBound :: Int)` wywołuje błąd GHC lub co?

threadDelay (maxBound :: Int) 

To dało jakieś fałszywe ostrzeżenia:

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 

zrobiłem źle lub nie GHC?

+1

Czy jest to 32 czy 64 bity? – Cactus

+0

@Cactus 64-bitowy OSX. –

Odpowiedz

8

Wydaje się to być known GHC bug, z pewnymi postępami (chociaż nie wszystkie konfiguracje wydają się być jeszcze poprawione).

W międzyczasie można użyć forever (threadDelay (2^20)) lub podobnego rozwiązania jako obejścia; Aby uniknąć tego błędu, 2^20 powinno znajdować się z dala od maxBound, a budzenie się raz na sekundę przez kilka cykli powinno być dość łatwe w systemie.

+0

Dzięki. 'forever (threadDelay maxBound)' z tego raportu o błędzie jest lepszym pomysłem niż mój. –

+1

@MichaelFox Zaktualizowałem odpowiedź proponowanym rozwiązaniem. –

+0

Dzięki. Zrobię dokładnie to. –

Powiązane problemy