Haskell获取设置的线程名称

时间:2016-02-08 20:17:13

标签: haskell

当我用Java打印东西时,我通常会将该线程的名称附加到print语句中,因此我知道哪个线程正在运行什么print语句。如何在Haskell中获取和设置线程名称?如果我无法设置线程名称,如何创建具有给定名称的线程?

注意:我通常会给我的线程描述性名称,如" GUI_thread"," main_thread"," database_thread"等

1 个答案:

答案 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

然后,您应该使用threadedeventlog开关设置编译:

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 可能也是一个更好的主意 - 但我希望你能得到基本的想法