当我用Java打印东西时,我通常会将该线程的名称附加到print语句中,因此我知道哪个线程正在运行什么print语句。如何在Haskell中获取和设置线程名称?如果我无法设置线程名称,如何创建具有给定名称的线程?
注意:我通常会给我的线程描述性名称,如" GUI_thread"," main_thread"," database_thread"等
答案 0 :(得分:5)
正如我在评论中所说,您可以使用labelThread
为该主题提供标签。可悲的是,我无法找到一种方法将这个标签拉回来(我发现只有invalid ticket有人想要这样做。)
但是如Parallel and Concurrent Programming in Haskell中所述,您可以在此处获得事件日志视图:
(直接从那里 - 我希望没有人介意):
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
然后,您应该使用threaded
和eventlog
开关设置编译:
ghc mvar4.hs -threaded -eventlog
可以使用+RTS
和-l
调用它:
./mvar4 +RTS -l
最后,您可以使用ghc-evetns
查看输出:
ghc-events show mvar4.eventlog
这似乎不是你想要的,所以这里有一个(非常基本的)你自己如何做的例子(仅使用列表和MVar
来保持{{1}之间的关联和它的名字):
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
可能也是一个更好的主意 - 但我希望你能得到基本的想法