Pobieranie identyfikatora wątku bieżącego wywołania metody

122

Czy istnieje sposób na wydrukowanie bieżącego identyfikatora wątku, na którym jest wykonywana bieżąca metoda?

(proszę o obiektyw-c)

Alexi Groove
źródło
3
nall odpowiedział na pytanie, ale nie na prawdziwe pytanie… dlaczego chcesz wiedzieć? Oprócz debugowania lub zapewniania prawidłowego zachowania, podstawowe rzeczy na currentThread są ogólnie złym pomysłem.
bbum
Potrzebowałem go do tworzenia obiektów lokalnych wątków, które są dołączone do innego obiektu (tj. Skojarzone z obiektem nadrzędnym i wątkiem - nie tylko wątkiem).
adib

Odpowiedzi:

229
NSLog(@"%@", [NSThread currentThread]);
nall
źródło
Jakie jest znaczenie name = (null), jeśli wątek jest główny, zwraca NSThread: 0x60800006cb80> {number = 1, name = main}, Czy to oznacza, że ​​„name = (null)” odnosi się do wątku w tle.
Nirmala Maurya
A jak można zdobyć to nazwisko i numer? namezwraca pusty opis nawet dla main i numbernigdzie go nie ma
Hari Karam Singh
Szybki i brudny numer wątku: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);
neoneye
źródło
4
@ Rajneesh071 Rzeczywiście, czego jeszcze się spodziewałeś, wyświetlić identyfikator innego wątku?
znaczenie ma znaczenie
Metoda [NSThread currentThread]klasy zwraca obiekt NSThread. Możesz zarejestrować adres tego obiektu wątku, ale jak uzyskać numeryczny identyfikator wątku, taki jak to, co jest wyświetlane w debugerze Xcode? (Wątek 1 dla głównego wątku i rosnące liczby dla każdego dodatkowego wątku utworzonego przez Twoją aplikację.)
Duncan C
@Duncan: To prawie na pewno funkcja debuggera, a nie system operacyjny / środowisko wykonawcze.
Cameron
25

W Swift 5

print("Current thread \(Thread.current)")
dimo hamdy
źródło
12

W Swift

print("Current thread \(NSThread.currentThread())")
Glauco Neves
źródło
3

W Swift4

print ("\ (Thread.current)")

Jason
źródło
-1

możesz coś takiego zhakować (to po prostu drukuje, ale możesz iść dalej i dzielić, aż uzyskasz numer):

+ (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;
}
Czarodziej
źródło