linux – 在Ubuntu上的Haskell(GHC)中的ThreadDelay问题
发布时间:2020-12-14 00:59:44 所属栏目:Linux 来源:网络整理
导读:我注意到我的一些机器上的GHC.Conc中的threadDelay函数有奇怪的行为.以下程序: main = do print "start" threadDelay (1000 * 1000) print "done" 按预期运行需要1秒钟.另一方面,这个程序: {-# LANGUAGE BangPatterns #-}import Control.Concurrentmain =
我注意到我的一些机器上的GHC.Conc中的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("%in",i); usleep(1000); } return 0; } 做正确的事情,即运行’time ./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很好. 解决方法
threadDelay不是一个准确的计时器.它承诺你的线程至少会在它的参数说它应该的时候睡觉,但它不会承诺更多.如果您想要定期发生某些事情,您将不得不使用其他东西. (我不确定是什么,但可能
Unix’ realtime alarm signal会对你有用.)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |