gpt4 book ai didi

Haskell 获取设置的线程名称

转载 作者:行者123 更新时间:2023-12-02 13:37:55 26 4
gpt4 key购买 nike

当我在 Java 中打印某些内容时,我通常将线程的名称附加到打印语句中,这样我就知道哪个线程正在运行哪个打印语句。如何在 Haskell 中获取和设置线程名称?如果我无法设置线程名称,如何创建一个具有给定名称的线程?

注意:我通常为线程提供描述性名称,例如“GUI_thread”、“main_thread”、“database_thread”等

最佳答案

正如我在评论中所说,您可以使用 labelThread给线程一个标签。遗憾的是,我找不到一种方法来拉回这个标签(我发现的只是这个invalid ticket,有人想这样做)。

但如 Parallel and Concurrent Programming in Haskell 中所述您可以获得有关此的事件日志 View :

(直接从那里 - 我希望没人介意):

main = do
t <- myThreadId
labelThread t "main"
m <- newEmptyMVar
t <- forkIO $ putMVar m 'a'
labelThread t "a"
t <- forkIO $ putMVar m 'b'
labelThread t "b"
traceEventIO "before takeMVar"
takeMVar m
takeMVar m

然后,您应该使用 threadedeventlog 开关集来编译它:

ghc mvar4.hs -threaded -eventlog

并且可以使用+RTS-l调用它:

./mvar4 +RTS -l

最后您可以使用 ghc-evetns 查看输出:

ghc-events show mvar4.eventlog
<小时/>

天真的 self 实现

这似乎并不完全是您想要的,所以这里是一个(非常基本的)示例,说明您如何自己完成它(仅使用列表和 MVar 来保持 ThreadId 及其名称):

import Control.Concurrent

type Labels = MVar [(ThreadId, String)]

initLabels :: IO Labels
initLabels = newMVar []

labelThread :: Labels -> ThreadId -> String -> IO ()
labelThread labels threadId label =
modifyMVar_ labels (\assocs -> return $ (threadId, label):assocs)

getLabel :: Labels -> ThreadId -> IO String
getLabel labels threadId = withMVar labels (\assocs ->
case lookup threadId assocs of
Just label -> return label
Nothing -> return $ show threadId)

你可以像这样使用它:

main :: IO ()
main = do
ls <- initLabels
myId <- myThreadId
getLabel ls myId >>= print
labelThread ls myId "my Thread"
getLabel ls myId >>= print

这会让你:

λ> :main
"ThreadId 50"
"my Thread"

显然,如果您创建大量线程,这可能不是一个好主意。至少您应该在线程末尾添加一些内容以再次删除标签:

removeLabel :: Labels -> ThreadId -> IO ()
removeLabel labels threadId =
modifyMVar_ labels (return . filter ((/= threadId) . fst))

forkLabeledIO :: Labels -> String -> IO () -> IO ThreadId
forkLabeledIO labels label computation = forkIO $ do
myId <- myThreadId
labelThread labels myId label
computation
removeLabel labels myId

...是的,我知道:令人讨厌 - 当然 map 也可能是一个更好的主意 - 但我希望你明白基本的想法

关于Haskell 获取设置的线程名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35278498/

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