gpt4 book ai didi

haskell - 为什么 sleep 不起作用?

转载 作者:行者123 更新时间:2023-12-03 14:57:29 28 4
gpt4 key购买 nike

为什么c_sleep在下面的代码中立即返回?

{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.Types
import Data.Time.Clock
import Control.Concurrent

foreign import ccall unsafe "unistd.h sleep"
c_sleep :: CUInt -> IO CUInt

main :: IO ()
main = do
getCurrentTime >>= print . utctDayTime
c_sleep 10 >>= print -- this doesn't sleep
getCurrentTime >>= print . utctDayTime
threadDelay $ 10 * 1000 * 1000 -- this does sleep
getCurrentTime >>= print . utctDayTime

$ ghc --make Sleep.hs && ./Sleep
[1 of 1] 编译 Main ( Sleep.hs, Sleep.o )
连接 sleep ...
29448.191603s
10
29448.20158s
29458.211402s

$ ghc --版本
Glorious Glasgow Haskell 编译系统,版本 7.8.3

$ cabal --版本
cabal 安装版本 1.20.0.3
使用 Cabal 库的 1.20.0.0 版本

注:其实我想用 sleep 在 C 代码中模拟函数中的一些繁重计算 func并在 Haskell 中调用该函数,但这也不起作用,可能是出于相同的原因。

最佳答案

GHC的RTS appears to use signals为其own purposes ,这意味着 sleep 很快就会被这些信号之一打断。我也不认为这是一个错误,运行时会 come with its own territory , 可以这么说。 Haskellian 方法是使用 threadDelay但是对于一个 C 程序来说,没有一些技巧来访问它并不容易。

proper way就是不顾其他信号的干扰,反复恢复 sleep 。我推荐使用 nanosleep自从 sleep只有几秒钟的精度,而且信号似乎比这更频繁地出现。

#include <errno.h>
#include <time.h>

/* same as 'sleep' except it doesn't get interrupted by signals */
int keep_sleeping(unsigned long sec) {
struct timespec rem, req = { (time_t) sec, 0 }; /* warning: may overflow */
while ((rem.tv_sec || rem.tv_nsec) && nanosleep(&req, &rem)) {
if (errno != EINTR) /* this check is probably unnecessary */
return -1;
req = rem;
}
return 0;
}

关于haskell - 为什么 sleep 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28294239/

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