我目前使用以下代码启动工作线程。
import Control.Monad (void)
import Control.Concurrent (forkIO)
import Control.Exception (finally)
import Data.IORef (newIORef, writeIORef, readIORef)
startWorker :: IO a -> IO (IO Bool)
startWorker work = do
running <- newIORef True
_ <- forkIO $ void work `finally` writeIORef running False
return $ readIORef running
即在后台开始执行一些工作,并返回一个IO操作,让调用者轮询工作线程是否仍在运行或因某种原因停止。
这种方法有多可靠?是否存在线程在不调用finally块的情况下死亡的情况(当然,除了整个进程被杀死的情况)?有没有更好的方法来实现相同的功能?