私のマシンの一部でGHC.ConcのthreadDelay関数で奇妙な動作が確認されました。次のプログラム:UbuntuでのHaskell(GHC)でのThreadDelayの問題
main = do print "start"
threadDelay (1000 * 1000)
print "done"
は、予想どおり実行に1秒かかります。一方、このプログラム:期待通りに他のマシン上で、それは、約1秒かかりますけれども
{-# 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)
は、私のマシンの2上で実行するのに約10秒かかります。 (私は上記の両方のプログラムを '-threaded'フラグでコンパイルしました)ここにThreadscopeのスクリーンショットがあり、10ミリ秒ごとに1回だけアクティビティがあることがわかります:
一方、プログラムは、合計1秒を要した上で、私のマシンのいずれかからThreadScope:
同様の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;
}
は正しいことを行い、すなわち実行されている「タイム./a.outは」のような出力を提供します:
1
2
...
999
real 0m1.080s
user 0m0.000s
sys 0m0.020s
この問題が発生したことがある人は誰ですか?もしそうなら、どのように修正できますか?私はすべてのマシンでLinux用のghc 7.2.1(x86_64)を実行していて、Ubuntuのさまざまなバージョンを実行しています。 Ubuntu 10.04.2ではうまく動作しますが、11.04では問題ありません。
実際に '-threaded'フラグを付けてコンパイルしました。 – Andreas