Observé un comportamiento extraño con la función threadDelay en GHC.Conc en algunas de mis máquinas. El siguiente programa:ThreadDelay Problema en Haskell (GHC) en Ubuntu
main = do print "start"
threadDelay (1000 * 1000)
print "done"
tarda 1 segundo en ejecutarse, como se esperaba. Por otra parte, este programa:
{-# 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)
tarda unos 10 segundos para ejecutarse en dos de mis máquinas, aunque en otras máquinas que tarda aproximadamente 1 segundo, como se esperaba. (He compilado los dos programas anteriores con el indicador '-threaded'). Aquí hay una captura de pantalla de Threadscope que muestra que hay actividad solo una vez cada 10 milisegundos:
Por otro lado, aquí hay una captura de pantalla de ThreadScope de una de mis máquinas en las que toma el programa de 1 segundo en total:
Un programa C similar:
#include <unistd.h>
#include <stdio.h>
int main() {
int i;
for (i=1; i < 1000; i++) {
printf("%i\n",i);
usleep(1000);
}
return 0;
}
hace lo correcto, 'tiempo ./a.out', es decir, se ejecuta da salida como :
1
2
...
999
real 0m1.080s
user 0m0.000s
sys 0m0.020s
¿Alguien ha tenido este problema anteriormente? Si es así, ¿cómo puede solucionarse? Estoy ejecutando ghc 7.2.1 para Linux (x86_64) en todas mis máquinas y estoy ejecutando varias versiones de Ubuntu. Funciona mal en Ubuntu 10.04.2, pero está bien en 11.04.
De hecho compilé con la bandera '-threaded'. – Andreas