为什么putStrLn不是原子的?

Turion

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

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 . show

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么putStrLn每次迭代都会变慢?

来自分类Dev

为什么zio的putStrLn没有输出

来自分类Dev

C ++递减单字节(易失性)数组的元素不是原子的!为什么?(另外:我如何在Atmel AVR mcus / Arduino中强制原子化)

来自分类Dev

为什么使用原子在这里?

来自分类Dev

为什么原子美化无法正常工作?

来自分类Dev

什么是过时的“ Data.ByteString.Lazy.putStrLn”更安全正确的替代方法,为什么?

来自分类Dev

为什么不是'|' 被超载?

来自分类Dev

为什么布尔值需要是原子的?

来自分类Dev

为什么存在shared_ptr的原子重载

来自分类Dev

C#bool是原子的,为什么volatile有效

来自分类Dev

为什么使用volatile使原子变长和变长

来自分类Dev

为什么Clojure的原子交换!返回新值?

来自分类Dev

为什么挥发性变量不用于原子性

来自分类Dev

为什么没有完全实现原子双重

来自分类Dev

为什么使用原子CAS的程序无法保持线程安全?

来自分类Dev

为什么布尔值需要是原子的?

来自分类Dev

为什么原子提供compare_exchange_strong?

来自分类Dev

为什么存在shared_ptr的原子重载

来自分类Dev

C#bool是原子的,为什么volatile有效

来自分类Dev

为什么原子操作需要独占缓存访问?

来自分类Dev

为什么某些原始类型缺少原子版本,而某些原始类型却存在原子版本?

来自分类Dev

为什么HTML UI元素作为原子反应设计中的原子?

来自分类Dev

为什么虚假共享仍然会影响非原子性,但远小于原子性?

来自分类Dev

为什么“想要”不是“最新”?

来自分类Dev

为什么Haskell使用->而不是=?

来自分类Dev

为什么不是“ 0” ==“ 0”?

来自分类Dev

为什么BigInteger不是原始的

来自分类Dev

为什么lambda不是功能

来自分类Dev

为什么不是尾递归?

Related 相关文章

  1. 1

    为什么putStrLn每次迭代都会变慢?

  2. 2

    为什么zio的putStrLn没有输出

  3. 3

    C ++递减单字节(易失性)数组的元素不是原子的!为什么?(另外:我如何在Atmel AVR mcus / Arduino中强制原子化)

  4. 4

    为什么使用原子在这里?

  5. 5

    为什么原子美化无法正常工作?

  6. 6

    什么是过时的“ Data.ByteString.Lazy.putStrLn”更安全正确的替代方法,为什么?

  7. 7

    为什么不是'|' 被超载?

  8. 8

    为什么布尔值需要是原子的?

  9. 9

    为什么存在shared_ptr的原子重载

  10. 10

    C#bool是原子的,为什么volatile有效

  11. 11

    为什么使用volatile使原子变长和变长

  12. 12

    为什么Clojure的原子交换!返回新值?

  13. 13

    为什么挥发性变量不用于原子性

  14. 14

    为什么没有完全实现原子双重

  15. 15

    为什么使用原子CAS的程序无法保持线程安全?

  16. 16

    为什么布尔值需要是原子的?

  17. 17

    为什么原子提供compare_exchange_strong?

  18. 18

    为什么存在shared_ptr的原子重载

  19. 19

    C#bool是原子的,为什么volatile有效

  20. 20

    为什么原子操作需要独占缓存访问?

  21. 21

    为什么某些原始类型缺少原子版本,而某些原始类型却存在原子版本?

  22. 22

    为什么HTML UI元素作为原子反应设计中的原子?

  23. 23

    为什么虚假共享仍然会影响非原子性,但远小于原子性?

  24. 24

    为什么“想要”不是“最新”?

  25. 25

    为什么Haskell使用->而不是=?

  26. 26

    为什么不是“ 0” ==“ 0”?

  27. 27

    为什么BigInteger不是原始的

  28. 28

    为什么lambda不是功能

  29. 29

    为什么不是尾递归?

热门标签

归档