gpt4 book ai didi

multithreading - 在线程之间共享一个 mvar

转载 作者:行者123 更新时间:2023-12-01 08:27:24 26 4
gpt4 key购买 nike

我正在尝试制作一个在用户按下回车之前打印箭头的程序(参见下面的代码)。

问题是当我按下回车时,我在控制台中看到了“stop”字符串,但它并没有改变 outputArrows 函数中 m 的值。

如何共享状态?

import Control.Concurrent
import Control.Concurrent.Async
import Control.Monad

waitForInput m = do
getLine
putStrLn "stop"
putMVar m True

outputArrows m = do
stop <- readMVar m
unless stop $ do
threadDelay 1000000
putStr ">"
outputArrows m

main = do
m <- newMVar False
th1 <- async (waitForInput m)
th2 <- async (outputArrows m)
wait th1
wait th2

最佳答案

您的 putMVar 实际上并没有在 MVar 中添加新值,而是无限期地阻塞。 MVar 就像只能容纳一个值的盒子。如果要替换值,需要先取出旧值。

如果您不需要 MVar 的阻塞行为,您应该只使用常规的 IORef或者可能是 TVar如果您需要确保更复杂的操作以原子方式运行。

关于multithreading - 在线程之间共享一个 mvar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com