Obtenir l'ID de thread de l'appel de méthode actuel

122

Existe-t-il un moyen d'imprimer l'ID de thread actuel sur lequel la méthode actuelle s'exécute?

(objectif-c s'il vous plaît)

Alexi Groove
la source
3
nall a répondu à la question, mais pas à la vraie question ... pourquoi voulez-vous savoir? Au-delà du débogage ou de l'affirmation d'un comportement correct, les éléments de base sur currentThread sont généralement une mauvaise idée.
bbum
Pour ma part, j'en avais besoin pour créer des objets thread-locaux qui sont attachés à un autre objet (c'est-à-dire associés à un objet parent et un thread - pas seulement le thread).
adib

Réponses:

229
NSLog(@"%@", [NSThread currentThread]);
nall
la source
Quelle est la signification de name = (null), si le thread est principal, il renvoie NSThread: 0x60800006cb80> {number = 1, name = main}, cela signifie-t-il que "name = (null)" fait référence au thread d'arrière-plan.
Nirmala Maurya
Et comment saisir ce nom et ce numéro? namerenvoie une description vide même pour main et numberest introuvable
Hari Karam Singh
Numéro de fil rapide et sale: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
la source
4
@ Rajneesh071 En effet, à quoi vous attendiez-vous d'autre, afficher l'ID d'un fil différent?
sens-questions
La [NSThread currentThread]méthode de classe renvoie un objet NSThread. Vous pouvez enregistrer l'adresse de cet objet de thread, mais comment obtenir l'ID de thread numérique, comme ce qui est affiché dans le débogueur Xcode? (Thread 1 pour le thread principal et nombre croissant pour chaque thread supplémentaire créé par votre application.)
Duncan C
@Duncan: C'est presque certainement une fonctionnalité du débogueur, pas du système d'exploitation / runtime.
Cameron
25

Dans Swift 5

print("Current thread \(Thread.current)")
dimo hamdy
la source
12

Dans Swift

print("Current thread \(NSThread.currentThread())")
Glauco Neves
la source
3

Dans Swift4

print ("\ (Thread.current)")

Jason
la source
-1

vous pouvez pirater quelque chose comme ça (cela imprime juste joli, mais vous pouvez continuer et diviser jusqu'à ce que vous obteniez le numéro):

+ (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;
}
As
la source