Haskell:线程在 STM 事务中无限期阻塞

2024-01-09

有没有办法增加一个时间间隔,RTS 根据该时间间隔来判断线程在 STM 事务中无限期阻塞? 这是我的代码:

import Control.Concurrent (ThreadId)
import Control.Concurrent.MVar (MVar,newMVar,withMVar)
import Control.Concurrent.STM
import qualified Control.Concurrent.ThreadManager as TM

data ThreadManager = ThreadManager { tmCounter::TVar Int, tmTM::MVar TM.ThreadManager }

data Settings = Settings {
    maxThreadsCount::Int }

createThreadManager :: Settings -> IO ThreadManager
createThreadManager s = do
    counter <- atomically $ newTVar (maxThreadsCount s)
    tm <- TM.make >>= newMVar
    return $ ThreadManager counter tm

forkManaged :: ThreadManager -> IO () -> IO ThreadId
forkManaged tm fn = do
    atomically $ do
        counter <- readTVar $ tmCounter tm
        check $ counter > 0
        writeTVar (tmCounter tm) (counter - 1)
    withMVar (tmTM tm) $ \thrdmgr -> TM.fork thrdmgr $ do
        fn
        atomically $ do
            counter <- readTVar $ tmCounter tm
            writeTVar (tmCounter tm) (counter + 1)

fork管理确保同时运行的托管线程的数量不超过最大线程数。在重负载之前它工作正常。在重负载下,RTS 会引发异常。我认为在重负载下,在资源的硬并发竞争中,某些线程根本没有时间访问 STM 上下文。所以我认为,增加RTS决定抛出此异常的时间间隔可能会解决问题。


丹尼尔·瓦格纳是对的。该决定不是在超时的情况下做出的。 rts中的相关代码位于Schedule.c https://github.com/ghc/ghc/blob/53b63e3034e280cd440e75a2a5ab35742263378e/rts/Schedule.c#2400

See the resurrectThreads抛出异常的函数。注释中描述了这只会抛出到GC后发现是垃圾的线程。 ezyang 描述了这对于 mvar 的作用:http://blog.ezyang.com/2011/07/blockedindefinitelyonmvar/ http://blog.ezyang.com/2011/07/blockedindefinitelyonmvar/

[有关的不良猜测check当我检查其来源并意识到这只是一个简单的防护/重试而不是早期论文中描述的内容时,将其删除 - 哎呀!我现在怀疑丹尼尔·瓦格纳在这里也是正确的,问题是计数器没有增加。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell:线程在 STM 事务中无限期阻塞 的相关文章

  • 异步调用的任务限制?

    我有一个同步工作的 NET 4 5 WCF 客户端 我正在更新它以使用新的异步 等待功能来进行多个同时服务器调用以同时获取数据块 在结束之前 我担心同时运行的所有线程将使服务器饱和 更不用说明年升级到该角色时会终止我的 Azure 辅助角色
  • 从另一个线程调用线程中的方法,python

    如何实现线程之间的通信 我有一个线程在其中执行一些操作 然后我需要从位于主程序线程中的对象调用一个方法 并且该方法应该在主进程中执行 class Foo def help self pass class MyThread threading
  • 如何为每个线程自动全局初始化/取消初始化某些内容?

    我有一个单位initialization and finalization部分 该单元包含一个复杂的对象 该对象在initialization并毁于finalization 但是 该对象还包含一个 ADO 连接 这使得跨线程使用它时出现问题
  • 不同类型的列表?

    data Plane Plane point Point normal Vector Double data Sphere Sphere center Point radius Double class Shape s where inte
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • Cabal:使用源代码构建目录

    我有一个src目录 在这个目录中我有Main hs文件和Test目录 在里面Test我有的目录Test hs模块 我需要用 cabal 来编译它 在我的阴谋集团文件中 我有 Executable main hs or lhs file co
  • Haskell/Idris 中的开放类型级别证明

    在 Idris Haskell 中 可以通过注释类型并使用 GADT 构造函数 例如使用 Vect 来证明数据的属性 但这需要将属性硬编码到类型中 例如 Vect 必须是与 List 不同的类型 是否有可能拥有具有开放属性集的类型 例如同时
  • 提升::亚洲。消息是在哪个线程中发送的?

    我试图了解内部工作boost asio图书馆 这真的很棒 我编写了一个简单的客户端 用于向服务器发送一条消息 问题是 它真正在哪个线程中发送消息 自从我使用async write 方法 调用后立即返回并且不发送任何内容 我已经评论了io s
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 多线程环境中的析构函数?

    我想知道在这样的课堂上会发生什么 class MyClass private std vector
  • HASKELL:解决河内塔

    下面的代码解决了 hanoi 使用预定义函数 moveLOD swapLOI 和 swapLID 返回移动列表的问题 MoveLOD 将 1 个圆盘从第一个位置移动到三元组第三个位置中的第三个销钉 此外 包含有关运动信息的字符串会堆积在字符
  • python线程方法卡住了

    我有课MyClass初始化时创建 7 个线程 一个线程是 TCPServer 另外 6 个线程是 TCPServer 的对象MyClassTCPServer 使用它来处理请求 我的目的是创建可以在后台运行的方法MyClass并维护6个线程
  • C#中如何获取正在运行的线程列表?

    我在 C 中创建动态线程 并且需要获取这些正在运行的线程的状态 List
  • 无需停止程序即可输入

    我正在尝试制作一个倒计时器来打印剩余时间 当您输入某些内容时 它会打印您输入的内容 我的问题是我不想等待输入 只是继续运行计时器 我的错误代码 timer 100 while True print timer timer 1 if inpu
  • 如何使用固定数量的工作线程实现简单线程

    我正在寻找最简单 最直接的方法来实现以下内容 主程序实例化worker 执行任务的线程 Only n任务可以同时运行 When n已达到 不再有工人 开始直到计数 正在运行的线程回落到下方n 我觉得Executors newFixedThr
  • PHP 多个 Ajax 请求:第一个请求阻止第二个请求

    我在一页上有 2 个 ajax 请求 我运行了第一个请求并单独启动了第二个请求 但第二个在第一个运行后停止工作 第一次结束后继续 第一个请求需要很长时间 大约 30 60 秒 此时我需要第二个请求来显示日志第一个请求发生的情况 我尝试使用
  • 不理解 Monoid 定义中态射的表示法

    我试图理解什么Monoid是从范畴论的角度来看的 但我对用来描述它的符号有点困惑 这是维基百科 在范畴论中 幺半群范畴 C I 中的幺半群 或幺半群对象 M 是一个对象 M 和两个态射 M M M 称为乘法 I M 称为单位 我的困惑在于态
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • 如何并行运行一组函数并等待完成结果?

    我需要同时异步运行一组繁重的函数并将结果填充到列表中 这是伪代码 List
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线

随机推荐