获取当前方法调用的线程ID

133
有没有一种方法可以在当前方法执行的线程上打印出当前线程id?
(请使用Objective-C语言)

4
Nall回答了这个问题,但没有回答真正的问题... 你为什么想知道?除了调试或确认正确的行为外,关于currentThread的基本信息通常不是一个好主意。 - bbum
1
我需要它来创建与另一个对象相关联的线程本地对象(即关联到父对象和线程,而不仅仅是线程)。 - adib
8个回答

243
NSLog(@"%@", [NSThread currentThread]);

如果线程是主线程,那么name =(null)的含义是什么?它返回NSThread:0x60800006cb80> {number = 1,name = main},这是否意味着“name =(null)”指的是后台线程? - Nirmala Maurya
1
那么如何获取那个名称和数字呢?即使是主函数,name返回空描述,而number也无处可寻。 - Hari Honor
1
快速而简短的线程号:NSString *s = [NSString stringWithFormat:@"%@", [NSThread currentThread]]; int threadNum = -1; sscanf(s.UTF8String, "<NSThread: 0x%*12[0-9a-f]>{number = %d", &threadNum); - Hari Honor

38

在Swift 5中

print("Current thread \(Thread.current)")

36
#include <pthread.h>
...
mach_port_t machTID = pthread_mach_thread_np(pthread_self());
NSLog(@"current thread: %x", machTID);

4
@Rajneesh071,确实,你还期待显示不同线程的ID吗? - meaning-matters
[NSThread currentThread] 类方法返回一个 NSThread 对象。你可以记录该线程对象的地址,但是如何获取数字线程 ID,就像在 Xcode 调试器中显示的那样呢?(主线程为 Thread 1,每个由你的应用程序创建的附加线程都会增加编号。) - Duncan C
@Duncan:那几乎肯定是调试器的一个特性,而不是操作系统/运行时的。 - Cameron

13

在Swift中

print("Current thread \(NSThread.currentThread())")

7
在 Swift4 中,
print("\(Thread.current)")

3
您可以像这样编写一些代码(这只是漂亮地打印输出,但您可以继续拆分直到获得数字):
+ (NSString *)getPrettyCurrentThreadDescription {
    NSString *raw = [NSString stringWithFormat:@"%@", [NSThread currentThread]];

    NSArray *firstSplit = [raw componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"{"]];
    if ([firstSplit count] > 1) {
        NSArray *secondSplit     = [firstSplit[1] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"}"]];
        if ([secondSplit count] > 0) {
            NSString *numberAndName = secondSplit[0];
            return numberAndName;
        }
    }

    return raw;
}

3
NSLog会在控制台输出一个数字(在冒号后的方括号中),用于标识调用它的线程。如下图所示:
NSLog output

0

uint64_t tid; pthread_threadid_np(NULL, &tid);

uint64_t tid; pthread_threadid_np(NULL,&tid);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接