lef*_*out 6 concurrency multithreading garbage-collection haskell
嗯...... - 显然,没什么!如果我试试
Prelude Control.Concurrent.Async Data.List> do {_ < - async $ return $!foldl'(+)0 [0,0.1 .. 1e + 8 :: Double]; 打印"异步丢失!"}
"异步丢失!"
一个处理器核心开始疯狂一段时间,界面保持正常.显然线程已启动,只要有事情要做就可以运行.
但是(效率除外),原则上是好的,还是必须Async始终被cancel引导或wait编辑?有什么东西会破坏,因为没有办法再读取结果吗?GC是否正确清理了一切?事实上,这个线程可能会被停止,而当我尝试它时(由于内存压力不足)这种情况还没有发生?线程是否正确地"结束",只是当forkIOed动作结束时?
我对这种并发性的东西很不确定.也许我仍然在用C++方式考虑这个问题.RAII /确定性垃圾收集肯定会让你在这方面感受到更好的照顾......
在内部,a Async只是一个Haskell线程,TMVar在完成后写入STM .A cancel只是向Haskell线程发送一个kill信号.在Haskell中,您不需要explcititly杀死线程.如果Async自己可以被垃圾收集,那么线程仍将运行到最后,然后一切都将被正确清理.但是,如果Async结束于异常,则会wait将异常传播给等待的线程.如果你不这样做wait,你永远不会知道发生了异常.
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |