Multithreading Haskell:STM事务中无限期阻塞的线程
有没有办法增加一个时间间隔,RTS根据这个时间间隔决定线程在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 =
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实现的有用链接!我会再次检查我的代码。