ghci和runghc中的不同并发行为

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不是真正的多线程?

Rom*_*aka 8

这与并发性无关.

您的解释和编译程序在他们使用的终端模式上有所不同:非规范与规范.

在规范模式中,您的程序在整行可用之前不会获得字符 - 因此您正在观察的效果.

要解决此问题,只需将句柄置于非缓冲模式:

import System.IO

main = do
   hSetBuffering stdin NoBuffering
   ...
Run Code Online (Sandbox Code Playgroud)