linux – 在Ubuntu上的Haskell(GHC)中的ThreadDelay问题

linux – 在Ubuntu上的Haskell(GHC)中的ThreadDelay问题,第1张

概述我注意到我的一些机器上的GHC.Conc中的threadDelay函数有奇怪的行为.以下程序: main = do print "start" threadDelay (1000 * 1000) print "done" 按预期运行需要1秒钟.另一方面,这个程序: {-# LANGUAGE BangPatterns #-}import Control.Co 我注意到我的一些机器上的GHC.Conc中的threadDelay函数有奇怪的行为.以下程序:

main = do print "start"          threadDelay (1000 * 1000)          print "done"

按预期运行需要1秒钟.另一方面,这个程序:

{-# LANGUAGE BangPatterns #-}import Control.Concurrentmain = 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;}

做正确的事情,即运行’time ./a.out’给出如下输出:

12...999real 0m1.080suser 0m0.000ssys  0m0.020s

有没有人遇到过这个问题,如果有的话,怎么解决这个问题呢?我在我的所有机器上运行ghc 7.2.1 for linux(x86_64)并运行各种版本的Ubuntu.它在Ubuntu 10.04.2上工作得很糟糕,但在11.04很好.

解决方法 threadDelay不是一个准确的计时器.它承诺你的线程至少会在它的参数说它应该的时候睡觉,但它不会承诺更多.如果您想要定期发生某些事情,您将不得不使用其他东西. (我不确定是什么,但可能 Unix’ realtime alarm signal会对你有用.) 总结

以上是内存溢出为你收集整理的linux – 在Ubuntu上的Haskell(GHC)中的ThreadDelay问题全部内容,希望文章能够帮你解决linux – 在Ubuntu上的Haskell(GHC)中的ThreadDelay问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1025626.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存