在GHCi中调试或玩游戏时,我经常会碰巧知道实际的ThreadId
号(例如,通过使用Debug.Trace
),但这仅是我的全部。
问题在于,所有线程API(例如killThread
)都需要ThreadId
而不是Int
。
我已经尝试过Hoogle,但还是空了出来。有没有办法做到这一点?我主要关心调试,所以我不介意这是一个讨厌的黑客,还是通过仅GHC的库。
最佳答案
你不能ThreadId
是抽象的。实际上,您拥有的Int
只是一个计数器(source):
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 }
在
rts_getThreadId
的ThreadId
实例中调用的是Show
。没有映射回实际的TSO。如果您想知道什么ThreadId
属于什么Int
,则需要自己对其进行跟踪。例如,您可以解析Int
并填充Map
。