4
我终于能够追踪我在下降到一个奇怪的错误(至少对我来说)令人惊讶的互动mask
和timeout
之间:为什么`mask_`中和`timeout`?
import System.Timeout
import Control.Exception
ack :: Int -> Int -> Int
ack m n | m == 0, n >= 0 = n + 1
| m > 0, n == 0 = ack (m - 1) 1
| m > 0, n > 0 = ack (m - 1) (ack m (n - 1))
tryack :: Int -> Int -> IO (Maybe Int)
tryack m n = timeout 100000 {- uS -} $ evaluate $ ack m n
main :: IO()
main = do
a <- tryack 3 11
print a -- Nothing
b <- mask_ $ tryack 3 11
print b -- Just 16381 after a few seconds
这在我看来是一个相当“非组成”互动,因为这意味着如果库在内部使用timeout
,外部应用mask
调用链的某处可能会导致库发生故障。
那么这是(已知的)timeout
的执行缺陷还是故意的?
对,这是不可避免的,因为超时需要计算在当前线程中运行。一个使用超时的库应该可能会派生一个新线程来逃避掩码。 – 2011-06-14 08:12:03