And*_*eas 5 linux ubuntu haskell
我注意到我的一些机器上的GHC.Conc中的threadDelay函数有奇怪的行为.以下程序:
main = do print "start"
threadDelay (1000 * 1000)
print "done"
Run Code Online (Sandbox Code Playgroud)
按预期运行需要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)
Run Code Online (Sandbox Code Playgroud)
在我的两台机器上运行大约需要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;
}
Run Code Online (Sandbox Code Playgroud)
做正确的事情,即运行'time ./a.out'给出如下输出:
1
2
...
999
real 0m1.080s
user 0m0.000s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这个问题,如果有的话,怎么解决这个问题呢?我在我的所有机器上运行ghc 7.2.1 for Linux(x86_64)并运行各种版本的Ubuntu.它在Ubuntu 10.04.2上工作得很糟糕,但在11.04很好.
threadDelay不是一个准确的计时器。它承诺您的线程将至少在其参数规定的时间内休眠,但除此之外它没有承诺任何其他内容。如果你想让某件事定期发生,你就必须使用其他东西。(我不确定是什么,但Unix 的实时警报信号可能对你有用。)