- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Haskell 轻量级线程 ( forkIO
) 使用以下代码:
import Control.Concurrent
beginTest :: IO ()
beginTest = go
where
go = do
putStrLn "Very interesting string"
go
return ()
main = do
threadID1 <- forkIO $ beginTest
threadID2 <- forkIO $ beginTest
threadID3 <- forkIO $ beginTest
threadID4 <- forkIO $ beginTest
threadID5 <- forkIO $ beginTest
let tID1 = show threadID1
let tID2 = show threadID2
let tID3 = show threadID3
let tID4 = show threadID4
let tID5 = show threadID5
putStrLn "Main Thread"
putStrLn $ tID1 ++ ", " ++ tID2 ++ ", " ++ tID3 ++ ", " ++ tID4 ++ ", " ++ tID5
getLine
putStrLn "Done"
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Main Thread
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very interesting string
Very VVVViMeeeenarrrrtiyyyyen r iiiieTnnnnshtttttreeeeierrrrnaeeeegdssss
ttttsiiiitTnnnnrhggggir nessssgatttt
drrrrIiiiiVdnnnne ggggr5
y1 ,VVVVi eeeenTrrrrthyyyyer reiiiieannnnsdtttttIeeeeidrrrrn eeeeg5ssss 2tttts,iiiit nnnnrTggggih nrssssgetttt
arrrrdiiiiVInnnnedggggr
y5 3VVVVi,eeeen rrrrtTyyyyeh rriiiieennnnsatttttdeeeeiIrrrrndeeeeg ssss 5tttts4iiiit,nnnnr ggggiT nhssssgrtttt
errrraiiiiVdnnnneIggggrd
y 5VVVVi5eeeen
rrrrtyyyye riiiiennnnsttttteeeeirrrrneeeegssss ttttsiiiitnnnnrggggi nssssgtttt
rrrriiiiVnnnneggggr
y VVVVieeeenrrrrtyyyye riiiiennnnsttttteeeeirrrrneeeegssss ttttsiiiitnnnnrggggi nssssgtttt
rrrriiiiVnnnneggggr
Very interesting string
s 最终彼此重叠,因为不知何故线程使用
putStrLn
同时最终在彼此之上写入标准输出。为什么会这样,以及如何(不求助于消息传递、计时或其他一些过于复杂和令人费解的解决方案)可以克服它?
最佳答案
简单地说,putStrLn
不是原子操作。每个字符都可以与来自不同线程的任何其他字符交错。
(我也不确定在多字节编码(如 UTF8)中是否保证多字节字符是原子处理的。)
如果你想要原子性,你可以使用共享互斥锁,例如
do lock <- newMVar ()
let atomicPutStrLn str = takeMVar lock >> putStrLn str >> putMVar lock ()
forkIO $ forever (atomicPutStrLn "hello")
forkIO $ forever (atomicPutStrLn "world")
do lock <- newMVar ()
let atomicPutStrLn str = withMVar lock (\_ -> putStrLn str)
forkIO $ forever (atomicPutStrLn "hello")
forkIO $ forever (atomicPutStrLn "world")
关于multithreading - Haskell forkIO 线程使用 putStrLn 在彼此之上写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32040536/
我没有在haskell中做过任何网络化的事情,所以我现在尝试一下。我使用 Oleg 的 ZFS 作为模板如何做到这一点。 IIRC 他没有使用线程,而是使用“定界延续”,所以我想知道是否也可以在不使用
我正在尝试在 Haskell 中使用并发进行特定优化,其中只需要两个值中的一个,并且根据情况,创建其中一个值可能比另一个快得多。 我想我可以只用 forkIO 运行 2 个线程,然后等到一个值放入 M
我在做基准测试 forkIO使用以下代码: import System.Time.Extra import Control.Concurrent import Control.Monad import
我试图了解协程,但考虑到 forkIO 线程的存在,我不太了解它们的目的。哪些用例需要在线程上使用协程? 最佳答案 如果您在谈论特定的 Haskell 协程实现(如果是,请添加链接),或者关于一般概念
如果我使用 forkIO 创建一个线程,我需要提供一个函数来运行并取回一个标识符(threadID)。然后我可以通过例如与这种动物交流。工作负载,MVAR 等。但是,据我了解,创建的线程非常有限,只能
我们如何让用户传递一个 eventHandler,它使用 stateMonad 但在单独的线程中调用?比如下面的例子中,应该如何调用forkIO,以便eventHandler可以调用操作呢?我是 Ha
我正在尝试让多个客户端连接到服务器。我设法做的是通过使用服务器将一个客户端连接到服务器: main = withSocketsDo $ do socket
我正在使用 Haskell 轻量级线程 ( forkIO ) 使用以下代码: import Control.Concurrent beginTest :: IO () beginTest = go
我希望有人能帮助我理解为什么下面的代码会生成下面的输出。代码来自 Simon Marlow 书中的并发章节(链接如下)。 根据对各种功能的描述,我假设第二个 putMVar鉴于 (i) 两个 putM
我不确定 Haskell 中的 forkIO/forkOS 和 forkProcess 之间有什么区别。据我了解,forkIO/forkOS 更像是线程(类似于 C 中的 pthread_create
我已经编写了下面的代码,并注意到 killThread 阻塞并且线程仍在继续。只有当我在 forkProcess 中执行此操作时才会发生这种情况,如果我删除 forkProcess,一切都会按预期进行
我正在寻找的是一个简单的类型函数: alive :: ThreadID -> IO Bool 最佳答案 这对于标准 base 是不可能的。据我所知,库,但您可以使用 GHC 特定的 API 来获取线程
我是一名优秀的程序员,十分优秀!