作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码似乎卡在 readMVar
上在另一个线程调用 putMVar
之后.我不希望这种情况发生,但这就是我正在观察的。我的主线程创建了两个新线程,每个线程都可以访问共享的 MVar
米。
主题 1:
do
putStrLn "tick"
x <- readMVar m
putStrLn "tock"
do
putMVar m 0
putStrLn "put m0"
void $ tryTakeMVar m
putStrLn "take m"
putMVar m 1
putStrLn "put m1"
do
m <- newEmptyMVar
<start thread 1>
<start thread 2>
m
,它最初是空的。线程 1 块位于
readMVar m
.同时,线程 2 调用
putMVar m ...
.此时,线程 1 可以继续,但我们假设它没有。然后线程 2 调用
tryTakeMVar m
,这大概会清空一个完整的
MVar
.然后线程 2 再次调用
putMVar m ...
.此场景对应于以下输出:
tick
put m0
take m
put m1
<hang>
最佳答案
我从 base
切换了我的 MVar 实现至 strict-concurrency
在尝试调试空间泄漏时。但正如问题所示,我的代码使用 tryReadMVar
,出于某种原因,strict-concurrency
未提供.因此,不久前,我实现了 tryReadMVar
我自己是这样的:
tryReadMVar :: (NFData a) => MVar a -> IO (Maybe a)
tryReadMVar m = do
mm <- tryTakeMVar m
case mm of
Nothing -> return ()
Just a -> putMVar m a
return mm
base
曾经做过类似的事情,但较新的版本有一个原子
tryReadMVar
执行。因此,即使我使用的是新版本的 GHC,由于使用了
strict-concurrency
,问题再次出现。 .
putMVar
放置 mvar tryTakeMVar
获取 mvar内tryReadMVar
tryTakeMVar
获取 mvar putMVar
放置 mvar putMVar
内tryReadMVar
tryReadMVar
有用!
关于multithreading - readMVar 不会在 putMVar 上唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120390/
我的代码似乎卡在 readMVar 上在另一个线程调用 putMVar 之后.我不希望这种情况发生,但这就是我正在观察的。我的主线程创建了两个新线程,每个线程都可以访问共享的 MVar米。 主题 1:
我是一名优秀的程序员,十分优秀!