multithreading - 当 Async 值被垃圾收集时会发生什么?

标签 multithreading haskell concurrency garbage-collection

嗯……——显然,什么都没有!如果我尝试

Prelude Control.Concurrent.Async Data.List> do {_ <- async $ return $! foldl'(+) 0 [0,0.1 .. 1e+8 :: Double]; print "Async is lost!"}
"Async is lost!"



一个处理器内核开始疯狂一段时间,界面保持正常。显然,线程已启动,只要有事情要做,它就会运行。

但是(抛开效率不谈),原则上是可以的,还是必须Async s 始终是 cancel领导或wait编为?是否因为无法再读取结果而出现问题? GC 是否正确清理了所有内容?也许线程实际上会被停止,而当我尝试它时还没有发生(因为缺乏内存压力)?线程是否完全正确地“结束”了,只是当 forkIO ed行动结束?

我对这个并发的东西很不确定。也许我仍然以 C++ 的方式思考这个问题。 RAII/确定性垃圾收集肯定会让你在这些方面感觉更好一些......

最佳答案

在内部,Async只是一个写入 STM TMVar 的 Haskell 线程等结束了。一个 cancel只是向 Haskell 线程发送终止信号。在 Haskell 中,您不需要明确地杀死线程。如果 Async本身可以被垃圾收集,然后线程仍然会运行到它的末尾,然后一切都会被正确清理。但是,如果 Async以异常结束,然后 wait会将异常传播到等待线程。如果你不 wait ,你永远不会知道异常发生了。

关于multithreading - 当 Async 值被垃圾收集时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20402216/

相关文章:

java - 以编程方式确定哪个 Java 线程持有锁

c# - 使用 Mutex 'using' 时 Try-Finally-Release 是否多余?

node.js - 慢速磁盘 I/O 是否会降低 Node.js 应用程序其余部分的性能?

c# - 实现线程安全的队列或列表时,返回Count前是否需要加锁?

c++ - 线程池的 lambda 函数内部的编译器错误变量 "Not captured"

json - 容错 JSON 解析

parsing - 如何在使用 Data.Aeson 解析 JSON 时正确出错

java - 为什么 Java 中的确定性算法会在不同的时间运行?

c# - 线程池和委托(delegate)操作 - WaitHandle.WaitAll()

haskell - 卡在状态单子(monad)中