ami*_*dfv 0 concurrency haskell ghc
我有一些简单的代码以固定的时间间隔打印到屏幕上,除非IORef设置为指示用户当前正在键入:
import Data.IORef
import Control.Concurrent
main = do
amTyping <- newIORef False
forkIO $ printALot amTyping
aChar <- getChar
writeIORef amTyping True
aLine <- getLine
writeIORef amTyping False
putStrLn $ aChar : aLine
main
printALot :: IORef Bool -> IO ()
printALot theRef = do
putStrLn "1111111"
threadDelay 1000000
isTyping <- readIORef theRef
if isTyping
then return ()
else printALot theRef
Run Code Online (Sandbox Code Playgroud)
这在GHCi中运行得非常好,但是当我使用runghc(或编译它)时,读取或写入IORef似乎不起作用 - printALot只是继续循环,超越用户键入的任何内容.
ghci和runghc /编译之间有什么区别?我IORef是错误的,但没有注意到因为ghci不是真正的多线程?
这与并发性无关.
您的解释和编译程序在他们使用的终端模式上有所不同:非规范与规范.
在规范模式中,您的程序在整行可用之前不会获得字符 - 因此您正在观察的效果.
要解决此问题,只需将句柄置于非缓冲模式:
import System.IO
main = do
hSetBuffering stdin NoBuffering
...
Run Code Online (Sandbox Code Playgroud)