【发布时间】:2018-08-04 18:34:30
【问题描述】:
函数 pthread_setname_np 在 macOS 上只接受一个参数,并设置当前线程的线程名称。基本上它的作用是调用 proc_info 系统调用如下(代码来自Apple open-source 页面):
__proc_info(PROC_INFO_CALL_SETCONTROL, getpid(), PROC_SELFSET_THREADNAME, 0, name, length);
但是 NSThread 的 setName 方法是(唯一)在另一个线程中设置线程名称的方法(Xcode 和 lldb 显示新名称)。由于 NSThread 的实现没有可用的源代码,我反汇编了 Foundation 框架(/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation)并找到了这段代码:
如您所见,它仅使用 pthread_setname_np(似乎只有在 self == [NSThread currentThread] 时才调用它)并且不直接调用 proc_info。我尝试使用 dtruss 调试 setName 并发现如果从不同的线程调用 proc_info 系统调用实际上是在 setName 事件上调用的,当对 setName 的调用添加到代码中时,我得到以下行:
proc_info(0x5, 0x15496, 0x2) = 0 0
那么实际上有没有办法在不同的线程中设置线程名称?它是如何完成的?而为什么setName的反汇编只有pthread_setname_np调用呢?
附言。我知道可以使解决方法(蹦床)从不同的线程传递名称,然后在必须更改名称的线程内调用 pthread_setname_np,但我对 setName 的实际实现方式感兴趣。
编辑: 我从两个不同的线程调用 setName,dtruss 输出以下内容(第一列是 pid/tid),0x4f800a (5210122) 是我要更改名称的线程的 tid:
37555/0x4f800a: 37 6 0 thread_selfid(0x0, 0x0, 0x0) = 5210122 0
37555/0x4f800a: 218 11 5 proc_info(0x5, 0x92B3, 0x2) = 0 0
37555/0x4f800a: 243 6 2 proc_info(0x5, 0x92B3, 0x2) = 0 0
这意味着 proc_info 调用以某种方式挂接到线程的代码中。看起来像是一个 Objective-C 运行时特性。
【问题讨论】:
标签: objective-c c multithreading macos pthreads