multithreading - 检查线程是否仍在运行的可靠方法是什么?

标签 multithreading haskell

我目前主要使用以下代码来启动工作线程。

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

IE。开始在后台做一些工作并返回一个 IO 操作,让调用者轮询工作线程是否仍在运行或由于某种原因已停止。

这种方法有多可靠?是否存在线程在不调用 finally 的情况下死亡的情况?块(当然,不包括整个进程被杀死的情况)?有没有更好的方法来实现相同的功能?

最佳答案

异步异常可能会在线程创建后触发,但在“void work `finally` writeIORef running False”启动之前。使用 forkFinally处理那个。

我可以想象还有其他问题。我推荐 async图书馆。它为您处理所有的复杂性。使用 poll查看 Async地位。

关于multithreading - 检查线程是否仍在运行的可靠方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22711426/

相关文章:

c# - 任务并行库执行长时间运行的操作

c# - 为什么魔法锁定 System.Object 的实例允许不同于锁定特定实例类型?

haskell - 设计基本的 Haskell 基准测试代码

parsing - 在 Haskell/Parsec 中引发 ParseError

c++ - 当人们谈论并发时, "transaction"是什么意思?

c - 程序在 pthread 锁上自旋

ios - 使用 AFIncrementalStore 和 NSFetchedResultsController 的死锁

haskell - 是否可以在 CentOS 上安装 Haskell 平台?

Haskell 为什么 "Num x"需要 "Show x"?

parsing - 快乐:这不是关键字