我是 Haskell 的新手,我不知道我对 Haskell wiki 上的这个例子有什么不理解:http ://www.haskell.org/haskellwiki/Implement_a_chat_server
有问题的具体代码是这样的:
runConn :: (Socket, SockAddr) -> Chan Msg -> -> IO ()
runConn (sock, _) chan = do
let broadcast msg = writeChan chan msg
hdl <- socketToHandle sock ReadWriteMode
hSetBuffering hdl NoBuffering
chan' <- dupChan chan
-- fork off thread for reading from the duplicated channel
forkIO $ fix $ \loop -> do
line <- readChan chan'
hPutStrLn hdl line
loop
-- read lines from socket and echo them back to the user
fix $ \loop -> do
line <- liftM init (hGetLine hdl)
broadcast line
loop
hdl
上面的代码有一个线程同时(可能)写入句柄,因为另一个线程正在读取它。这安全吗?
我怀疑forkIO
(Haskell 内部而不是系统线程库或进程)的性质是使它工作的原因,但我不确定。
我检查了forkIO的文档中是否提到了 IO 句柄,但一无所获。我还检查了System.IO的文档,但找不到任何提及在不使用锁定的情况下在线程之间使用句柄的内容。
那么,当文档没有提到任何关于线程安全的内容时,有人可以告诉我如何知道这样的事情何时是安全的吗?