为什么不睡觉?

泽塔

为什么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)
链接睡眠... 
29448.191603s 
10 
29448.20158s 
29458.211402s 

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

$ cabal --version 
cabal-install版本1.20.0.3,
使用Cabal库的版本1.20.0.0

注意:实际上,实际上,我想sleep在C代码中使用一个函数来模拟一些繁重的计算,func然后在Haskell中调用函数,但这也不起作用,可能是出于相同的原因。

uffle风

GHC的RTS似乎是出于自身 目的使用信号,这意味着不久就可以通过这些信号之一中断睡眠。我也不认为这是一个错误,可以这么说,运行时确实带有自己的区域Haskellian的方法是使用,threadDelay但是C程序要想获得一些窍门就很难访问它。

正确方法是重复恢复睡眠,尽管其它信号的干扰。我建议使用,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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章