代码之家  ›  专栏  ›  技术社区  ›  Quuxplusone

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

  •  11
  • Quuxplusone  · 技术社区  · 12 年前

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

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

    enter image description here

    4 回复  |  直到 12 年前
        1
  •  11
  •   Vladimir    12 年前

    可能不会 确切地 你想要什么,但NSThread有 setName: 方法,可以设置线程的名称,您可以将有意义的名称附加到线程,以便在调试器中获得以下内容:

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

    enter image description here

    还要记住,一些api(如grand-central dispatch)使用线程池进行操作,因此不能保证在哪个线程上执行操作

    编辑: com.apple.main-thread , com.apple.libdispatch-manager 等等是相应调度队列的标签。使用创建队列时,可以设置标签值 dispatch_queue_create 函数,然后使用从队列中获取 dispatch_queue_get_label 作用

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

        2
  •  4
  •   Caleb    12 年前

    如果可以获取对要更改其名称的线程的引用,则可以在调试器控制台中对其进行更改。对于当前线程,有两种方法可以做到这一点:

    • (lldb) po [[NSThread currentThread] setName:@"foo"]

    • (lldb) expression (void)[(NSThread*)[NSThread currentThread] setName:@"foo"];

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

        3
  •  3
  •   j.s.com    4 年前

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

        pthread_setname_np("myThreadName")
    
        4
  •  1
  •   user2902980    8 年前

    -[NSThread setName:]的pesudo代码

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

    所以,设置名称最简单的方法是调用 pthread_setname_np