2015-08-06 6 views
8

Ich möchte mein Programm im Grunde für immer verriegelt, und der erste Gedanke, den ich hatte, war:Ist `threadDelay (maxBound :: Int)` ein GHC Bug oder was?

threadDelay (maxBound :: Int) 

Dieses einige falsche Warnungen gab:

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 

habe ich falsch gemacht oder GHC tat?

+1

Ist dies auf 32 oder 64 Bits? – Cactus

+0

@ Kaktus 64-Bit OSX. –

Antwort

8

Dies scheint ein known GHC bug zu sein, mit etwas Fortschritt gemacht (obwohl nicht alle Konfigurationen scheinen noch behoben zu sein).

In der Zwischenzeit könnten Sie forever (threadDelay (2^20)) oder ähnliches als Workaround verwenden; 2^20 sollte weit genug von maxBound entfernt sein, um diesen Fehler zu vermeiden, und das Aufwachen einmal pro Sekunde für ein paar Zyklen sollte ziemlich einfach auf Ihrem System sein.

+0

Danke. 'forever (threadDelay maxBound)' von diesem Fehlerbericht ist eine bessere Idee als meine. –

+1

@MichaelFox Ich habe die Antwort mit einer vorgeschlagenen Problemumgehung aktualisiert. –

+0

Danke. Ich werde genau das tun. –