gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:23:24 26 4
gpt4 key购买 nike

我注意到我的一些机器上 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 毫秒只有一次事件:Screenshot of ThreadScope showing that threadDelay of 1 millisecond sleeps for 10 milliseconds.

另一方面,这是我的一台机器上 ThreadScope 的屏幕截图,程序在该机器上总共耗时 1 秒:Screenshot of ThreadScope showing that threadDelay of 1 millisecond sleeps for about 1 milliseconds.

类似的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' 给出如下输出:

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 不是一个准确的计时器。它 promise 您的线程将 sleep 至少,只要它的参数表明它应该,但它没有 promise 更多。如果您希望某些事情定期发生,您将不得不使用其他东西。 (我不确定是什么,但可能 Unix' realtime alarm signal 对你有用。)

关于linux - Ubuntu 上 Haskell (GHC) 中的 ThreadDelay 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7435771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com