Получение идентификатора потока текущего вызова метода


122

Есть ли способ распечатать идентификатор текущего потока, в котором выполняется текущий метод?

(цель-с, пожалуйста)


3
все ответил на вопрос, но не на настоящий вопрос .... почему вы хотите знать? Помимо отладки или подтверждения правильного поведения, базовые вещи в currentThread, как правило, являются плохой идеей.
bbum

Мне, например, нужно было создавать локальные для потока объекты, которые прикреплены к другому объекту (т.е. связаны с родительским объектом и потоком, а не только с потоком).
адиб

Ответы:


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

Что означает name = (null), если поток является основным, он возвращает NSThread: 0x60800006cb80> {number = 1, name = main}. Означает ли это, что «name = (null)» относится к фоновому потоку.
Нирмала Маурья

А как взять это имя и номер? nameвозвращает пустое описание даже для основного и numberнигде не может быть найдено
Хари Карам Сингх

Быстрый и грязный номер NSString *s = [NSString stringWithFormat:@"%@", [NSThread currentThread]]; int threadNum = -1; sscanf(s.UTF8String, "<NSThread: 0x%*12[0-9a-f]>{number = %d", &threadNum);
Хари Карам Сингх

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

4
@ Rajneesh071 Действительно, а чего еще вы ожидали, отобразить ID другого потока?
значение-имеет значение

Метод [NSThread currentThread]класса возвращает объект NSThread. Вы можете зарегистрировать адрес этого объекта потока, но как получить числовой идентификатор потока, например, что отображается в отладчике Xcode? (Поток 1 для основного потока и увеличивающиеся числа для каждого дополнительного потока, созданного вашим приложением.)
Дункан Си,

@Duncan: Это почти наверняка функция отладчика, а не ОС / среды выполнения.
Кэмерон




-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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.