在知道实际数字的情况下,如何构建ThreadId?

Jak*_*old 5 haskell ghc ghci

在GHCi中进行调试或玩游戏时,我经常会碰巧知道实际的ThreadId数字(例如来自使用Debug.Trace),但这就是我所拥有的.

问题是所有线程API,例如killThread需要ThreadId而不是Int.

我已经尝试了Hoogle,但却出了问题.有没有办法做到这一点?我主要关心调试,所以我不介意它是一个讨厌的黑客,还是通过一个GHC专用库.

Zet*_*eta 12

你不能.ThreadId是抽象的.在Int你实际上只不过是一个计数器(多):

32  static StgThreadID next_thread_id = 1;
...
59  StgTSO *
60  createThread(Capability *cap, W_ size)
61  {
62      StgTSO *tso;
...
126     ACQUIRE_LOCK(&sched_mutex);
127     tso->id = next_thread_id++;  // while we have the mutex
...
130     RELEASE_LOCK(&sched_mutex);
...
136 }
...
161 int
162 rts_getThreadId(StgPtr tso) 
163 {
164   return ((StgTSO *)tso)->id;
165 }
Run Code Online (Sandbox Code Playgroud)

这是rts_getThreadId在实例中调用ThreadIdShow.没有映射回实际的TSO.如果你想知道什么ThreadId属于什么Int,你需要自己跟踪它们.例如,您可以解析Int并填充a Map.

  • 我简直不敢相信我真的走下了兔子洞,看了看GHC的来源.疯狂正在缓慢但肯定地接管. (6认同)