我注意到我的一些機器上的GHC.Conc中的threadDelay函數有奇怪的行爲。以下程序:Ubuntu中的Haskell(GHC)中的ThreadDelay問題
main = do print "start"
threadDelay (1000 * 1000)
print "done"
需要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)
大約需要10秒,在兩個我的機器上運行,但在其他計算機上需要1秒左右,符合市場預期。 (我使用'-threaded'標記編譯了上述兩個程序。)以下是ThreadScope的屏幕截圖,顯示每10毫秒只有一次活動:
另一方面,從我的一臺機器ThreadScope上的程序需要1秒的總:
類似的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
有沒有人遇到過這個問題,如果是的話,這個問題怎麼解決?我在我所有的機器上運行ghc 7.2.1 for Linux(x86_64),並運行着各種版本的Ubuntu。它在Ubuntu 10.04.2上效果不錯,但在11.04上很好。
我確實編譯了'-threaded'標誌。 – Andreas