Tại sao c_sleep
trả lại ngay trong mã sau?Tại sao không ngủ?
{-# 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] Compiling Main (Sleep.hs, Sleep.o) Linking Sleep ... 29448.191603s 10 29448.20158s 29458.211402s $ ghc --version The Glorious Glasgow Haskell Compilation System, version 7.8.3 $ cabal --version cabal-install version 1.20.0.3 using version 1.20.0.0 of the Cabal library
Lưu ý: Thực ra, tôi muốn sử dụng sleep
trong mã C để mô phỏng một số tính toán nặng trong một hàm func
và gọi rằng chức năng trong Haskell, nhưng điều đó không làm việc, hoặc , có lẽ vì những lý do tương tự.
Có thể thời gian chạy GHC đang sử dụng tín hiệu làm gián đoạn 'ngủ'. Bạn đã kiểm tra mã lỗi chưa? Có lẽ bạn nên quấn nó trong một vòng lặp để khởi động lại nó nếu nó bị gián đoạn (trong trường hợp đó tốt nhất là sử dụng 'nanosleep' để có độ chính xác cao hơn). – Rufflewind
@Rufflewind: 'sleep' không trả lại mã lỗi, nhưng số tiền không được trả trong vài giây: /. Chưa thử 'nanosleep', nhưng' usleep' cũng không hoạt động. – Zeta
Mã lỗi được "trả về" thông qua biến 'errno'. Wrap '(c_sleep 10)' bên trong 'throwErrnoIf (/ = 0)" sleep "' và bạn sẽ thấy rằng nó đang bị gián đoạn. – Rufflewind