当我在 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 }
It's rts_getThreadId
被叫进来的ThreadId
's Show
实例。没有映射回实际的 TSO。如果你想知道什么ThreadId
属于什么Int
,您需要自己跟踪它们。例如,您可以解析Int
并填写一个Map
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)