Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Haskell:STM事务中无限期阻塞的线程_Multithreading_Haskell_Stm - Fatal编程技术网

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

Multithreading Haskell:STM事务中无限期阻塞的线程,multithreading,haskell,stm,Multithreading,Haskell,Stm,有没有办法增加一个时间间隔,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 =

有没有办法增加一个时间间隔,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)
import Control.Concurrent(线程ID)
import Control.Concurrent.MVar(MVar、newMVar、withMVar)
导入控制.Concurrent.STM
将符合条件的Control.Concurrent.ThreadManager作为TM导入
数据ThreadManager=ThreadManager{tmCounter::TVar Int,tmTM::MVar TM.ThreadManager}
数据设置=设置{
MaxThreadScont::Int}
createThreadManager::设置->IO线程管理器
createThreadManager s=do
计数器=newMVar
返回$ThreadManager计数器tm
forkManaged::ThreadManager->IO()->IO线程ID
forkManaged tm fn=do
原子级$do
计数器0
writeTVar(tmCounter tm)(计数器-1)
使用mvar(tmTM)$\thrdmgr->tm.fork thrdmgr$do
fn
原子级$do

counter丹尼尔·瓦格纳是对的。这个决定不是在超时的情况下做出的。rts中的相关代码位于

有关引发异常的位置,请参阅
resurrectThreads
函数。注释描述了这只会被抛出到GC后发现为垃圾的线程。ezyang描述了MVAR的工作原理:


[当我检查了
check
的源代码并意识到它只是一个简单的保护/重试,而不是之前的文章中描述的那样时,关于
check
的错误猜测被删除了--哎呀!我现在怀疑Daniel Wagner在这里也是正确的,问题是不知何故计数器没有增加。]

您确定是在超时的情况下做出决定的吗?我想它是用它的日志来决定两个
retry
s何时互相等待的。@Daniel:Daniel,我已经用STM提供了我的代码,更新了这个问题。这就是我认为超时问题的原因。
fn
是否有可能引发异常,并阻止计数器递增?@Daniel:我说的对吗,如果异常被引发,并且没有被我的代码捕获,那么我应该在控制台中看到它?实际上,这些fn在IO中进行了一些操作,但这些操作被包装到Control.Exception.catch中,我在控制台中没有看到任何投诉。Sclv,Daniel,感谢您的回复,特别是提供了到ghc rts实现的有用链接!我会再次检查我的代码。