Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以分配我自己的吗;“线程名称”;在Xcode中?_Xcode_Multithreading_Nsthread - Fatal编程技术网

我可以分配我自己的吗;“线程名称”;在Xcode中?

我可以分配我自己的吗;“线程名称”;在Xcode中?,xcode,multithreading,nsthread,Xcode,Multithreading,Nsthread,Xcode的“线程列表”窗格显示几个特殊线程的类似英文的名称:com.apple.main-thread、com.apple.libdispatch-manager、com.dispatchfractal.opencl、com.dispatchfractal.opengl、com.apple.root.low priority,。。。但对于用户创建的线程,该字段仅为空 有没有办法从我的应用程序中以编程方式设置“线程名称”字段?例如,如果我有一个专门用于网络I/O的线程,我希望它在调试器中显示为“

Xcode的“线程列表”窗格显示几个特殊线程的类似英文的名称:com.apple.main-thread、com.apple.libdispatch-manager、com.dispatchfractal.opencl、com.dispatchfractal.opengl、com.apple.root.low priority,。。。但对于用户创建的线程,该字段仅为空

有没有办法从我的应用程序中以编程方式设置“线程名称”字段?例如,如果我有一个专门用于网络I/O的线程,我希望它在调试器中显示为“com.example.network io”;如果我产生了五个工作线程,我希望能够将它们命名为“工作线程A”、“工作线程B”,等等。Xcode是否从我可以挂接到自己的API中提取其线程名称?可能类似于
CFAssignDebuggerNameToCurrentThread
?:)


可能不完全符合您的要求,但NSThread有
setName:
方法,允许您设置线程名称,您可以将有意义的名称附加到线程,以便在调试器中获得以下内容:

[[NSThread mainThread] setName:@"That is main thread!"];

还请记住,某些API(如grand central dispatch)使用线程池进行操作,因此无法保证操作将在哪个线程上执行

编辑:
com.apple.main thread
com.apple.libdispatch manager
等是相应调度队列的标签。您可以在使用
dispatch\u queue\u create
函数创建队列时设置标签值,然后使用
dispatch\u queue\u get\u label
函数从队列中获取标签值


似乎没有API来更改现有调度队列的标签值,我也不建议您更改系统队列的标签。

如果您可以获得要更改其名称的线程的引用,您可以在调试器控制台中更改它。为当前线程执行此操作的两种方法:

    pthread_setname_np("myThreadName")
  • (lldb)po[[NSThread currentThread]setName:@“foo”]

  • (lldb)表达式(void)[(NSThread*)[NSThread currentThread]setName:@“foo”]


我想您也可以从一个具有关联表达式的断点执行同样的操作。如果您知道有一个方法将在感兴趣的线程中运行,那么可以设置一个包含上述命令之一的断点,并在运行该命令后使其自动继续。这将产生每次运行代码时自动设置线程名称的效果,这可能有助于调试。

pesudo-code for-[NSThread-setName:]

- (void) setName:(NSString*)thname {
    if (self == [NSThread currentThread])
    {
        pthread_setname_np([thname UTF8String]);
    }
    else { ... }
    ...
}

因此,最简单的设置名称的方法是调用pthread_setname_np。

我使用Swift 5中的以下代码重命名当前线程:

    pthread_setname_np("myThreadName")

这不完全是我想要的,但它也有同样的目的。除非有人提出更好的想法,否则我会接受这个答案。仅供参考,我不担心GCD线程池。我的特定应用程序在GCD之外管理它自己的所有工作线程,原因不在这个问题的范围之内+1表示
po
表达式
;我对lldb中可能出现的情况知之甚少。