2015-08-06 10 views
8

Tôi muốn chương trình của tôi về cơ bản lockup mãi mãi và ý tưởng đầu tiên tôi có là:Liệu `threadDelay (maxBound :: Int)` có phải là lỗi của GHC hay không?

threadDelay (maxBound :: Int) 

này đưa ra một số cảnh báo giả mạo:

Prelude> import Control.Concurrent 
Prelude Control.Concurrent> threadDelay 10 
Prelude Control.Concurrent> threadDelay (maxBound :: Int) 
<interactive>: c_poll: invalid argument (Invalid argument) 
<interactive>: ioManagerWakeup: write: Bad file descriptor 

Tôi đã làm sai hoặc làm GHC?

+1

Đây có phải là 32 hoặc 64 bit không? – Cactus

+0

@Cactus 64-bit OSX. –

Trả lời

8

Điều này có vẻ là known GHC bug, với một số tiến trình được thực hiện (mặc dù không phải tất cả các cấu hình dường như đã được khắc phục).

Trong thời gian chờ đợi, bạn có thể sử dụng forever (threadDelay (2^20)) hoặc tương tự như giải pháp thay thế; 2^20 phải đủ xa maxBound để tránh lỗi này và thức dậy một lần mỗi giây cho một vài chu kỳ nên khá dễ dàng trên hệ thống của bạn.

+0

Cảm ơn. 'forever (threadDelay maxBound)' từ báo cáo lỗi đó là một ý tưởng hay hơn tôi. –

+1

@MichaelFox Tôi đã cập nhật câu trả lời với cách giải quyết được đề xuất. –

+0

Cảm ơn. Tôi sẽ làm chính xác điều đó. –

Các vấn đề liên quan