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


122

有没有办法打印出正在执行当前方法的当前线程ID?

(请使用objective-c)


3
纳尔回答了问题,但没有回答真正的问题。...您为什么想知道?除了调试或声明正确的行为外,currentThread上的基本内容通常不是一个好主意。
bbum

我需要一个它来创建附加到另一个对象的线程局部对象(即与父对象线程相关联-而不仅仅是线程)。
adib 2010年

Answers:


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

name =(null)的含义是什么,如果线程是main,则返回NSThread:0x60800006cb80> {number = 1,name = main},是否意味着“ name =(null)”是指后台线程。
Nirmala Maurya

以及如何抓住这个名字和号码?name甚至对于main都返回空的描述,并且number无处可寻
Hari Karam Singh

快速且肮脏的线程数:NSString *s = [NSString stringWithFormat:@"%@", [NSThread currentThread]]; int threadNum = -1; sscanf(s.UTF8String, "<NSThread: 0x%*12[0-9a-f]>{number = %d", &threadNum);
Hari Karam Singh

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

4
@ Rajneesh071确实,您还期望显示其他线程的ID吗?
含义-2014年

所述[NSThread currentThread]类方法返回一个NSThread对象。您可以记录该线程对象的地址,但是如何获得数字线程ID,如Xcode调试器中显示的那样?(主线程为线程1,由您的应用程序创建的每个附加线程为递增数字。)
Duncan C

@Duncan:这几乎肯定是调试器的功能,而不是操作系统/运行时。
卡梅伦



3

Swift4中

print(“ \(Thread.current)”)


-1

您可以修改这样的内容(这只会打印出漂亮的文字,但您可以继续进行拆分,直到获得数字为止):

+ (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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.