Ho notato un comportamento strano con la funzione threadDelay in GHC.Conc su alcune delle mie macchine. Il seguente programma:ThreadDelay Problema in Haskell (GHC) su Ubuntu
main = do print "start"
threadDelay (1000 * 1000)
print "done"
richiede 1 secondo per l'esecuzione, come previsto. D'altra parte, questo programma:
{-# LANGUAGE BangPatterns #-}
import Control.Concurrent
main = do print "start"
loop 1000
print "done"
where loop :: Int -> IO()
loop !n =
if n == 0
then return()
else do threadDelay 1000
loop (n-1)
richiede circa 10 secondi per l'esecuzione su due delle mie macchine, anche se su altre macchine ci vogliono circa 1 secondo, come previsto. (Ho compilato entrambi i programmi sopra con il flag "-threaded".) Ecco una schermata di Threadscope che mostra che c'è attività solo una volta ogni 10 millisecondi:
D'altra parte, ecco uno screenshot da ThreadScope da una delle mie macchine su cui il programma prende 1 secondo totale:
un simile programma C:
#include <unistd.h>
#include <stdio.h>
int main() {
int i;
for (i=1; i < 1000; i++) {
printf("%i\n",i);
usleep(1000);
}
return 0;
}
fa la cosa giusta, cioè in esecuzione 'di tempo ./a.out' un output come :
1
2
...
999
real 0m1.080s
user 0m0.000s
sys 0m0.020s
Qualcuno ha riscontrato questo problema prima e, in caso affermativo, come può essere risolto? Sto eseguendo ghc 7.2.1 per Linux (x86_64) su tutte le mie macchine e sto eseguendo varie versioni di Ubuntu. Funziona male su Ubuntu 10.04.2, ma va bene per la 11.04.
Ho effettivamente compilato con la bandiera '-favorata'. – Andreas