gpt4 book ai didi

haskell - 为什么 putStrLn 不是原子的?

转载 作者:行者123 更新时间:2023-12-02 16:36:07 25 4
gpt4 key购买 nike

为了练习并发编程,我编写了以下(次优)程序,该程序重复计算第一个大于用户输入的素数:

import Control.Concurrent
import Control.Concurrent.Chan
import Control.Monad (forever)
primeAtLeast n = -- Some pure code that looks up the first prime at least as big as n

outputPrimeAtLeast n = putStrLn $ show $ (n, primeAtLeast n)

main = do
chan <- newChan
worker <- forkIO $ forever $ readChan chan >>= outputPrimeAtLeast
forever $ (readLn :: (IO Int)) >>= (writeChan chan)
killThread worker

我希望在后台有一个工作线程来执行实际计算并在完成后立即输出 (n, primeAtLeast n)

它现在在做什么:只要我输入一个数字n,它立即输出(n,,将控制返回到主线程,计算 primeAtLeast n 在后台运行,并在完成后立即输出后半部分 primeAtLeast n)

那么 putStrLn 不是原子的吗?或者说问题出在哪里?

最佳答案

试试这个:

outputPrimeAtLeast n = let p = primeAtLeast n in p `seq` putStrLn $ show (n, p)

以上强制在运行 putStrLn 之前计算素数。

此外,您可以使用 print 而不是 putStrLn 。显示:

outputPrimeAtLeast n = let p = primeAtLeast n in p `seq` print (n, p)

或者,您可以使用 putStrLn 函数,该函数在开始打印任何内容之前强制执行每个字符。

strictPutStrLn :: Show a => a -> IO ()
strictPutStrLn x = let str = show x in str `listSeq` putStrLn str

listSeq :: [a] -> b -> b
listSeq [] w = w
listSeq (x:xs) w = x `seq` listSeq xs w

关于haskell - 为什么 putStrLn 不是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25710573/

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