Mac / iPhone: есть ли способ получить идентификатор потока без использования Objective-C? - PullRequest
13 голосов
/ 09 октября 2009

Есть ли способ получить любой идентификатор потока текущего запущенного потока, не прибегая к NSThread Objective-C.

Я улучшаю нашу пользовательскую систему трассировки отладки, чтобы правильно обрабатывать несколько потоков. Для каждой строки вывода трассировки я хотел бы напечатать идентификатор потока или имя потока. Потоки создаются различными способами, например, используются функции NSOperationQueue и pthread.

В настоящее время у меня есть следующие две альтернативы, но я не удовлетворен ни одной из них. Есть ли другие варианты?

опция pthread_t

pthread_t кажется typedef для конкретной платформы _opaque_pthread_h. Сейчас было бы хорошо использовать поля _opaque_pthread_h, даже если он хакерский и не переносимый. У него есть поле __sig типа long, но, похоже, это значение одинаково для всех потоков моего процесса.

NSThread option

[NSThread name] требует наличия NSAutoreleasePool, но я не хочу, чтобы это было обязательным требованием, так как большая часть нашего кода - чистый C ++, поэтому было бы неплохо просто запустить функцию c ++ без переноса пула авто-выпуска ,

Ответы [ 3 ]

23 голосов
/ 09 октября 2009

Я нашел один способ, которого достаточно, чтобы получить какой-то уникальный идентификатор для вывода трассировки.

pthread_mach_thread_np можно использовать для получения идентификатора потока, беззнакового целого на iPhone.

mach_port_t tid = pthread_mach_thread_np(pthread_self());

Очевидно, это тот же идентификатор потока, который используется в выводе NSLog.

1 голос
/ 09 октября 2009

См. pthread_getname_np.

К сожалению, имя NSThread в настоящее время не ограничено этим. Имя NSThread - это просто ivar, поэтому получить его невозможно, кроме как с помощью метода. Вы всегда можете создать функцию C, которая создает пул авто-релиза и получает имя. Ваш код C ++ не должен быть скомпилирован как ObjC ++.

pthread_getname_np вероятно, в любом случае, немного более полезно, чем имя NSThread. GDB и Instruments не знают об имени NSThread, только имя уровня pthread.

0 голосов
/ 29 октября 2015

Одним из недостатков использования имени порта Маха для идентификации потока является то, что возвращаемое имя является локальным для вызывающего процесса. Если несколько задач извлекают потоки конкретной задачи (используя task_threads), каждая задача извлекает свое имя порта для определенного потока.

В OS X вы можете получить уникальный 64-битный идентификатор, используя thread_info. Этот идентификатор является глобальным (он одинаков для данного потока, независимо от того, какая задача его запрашивает) и уникальным (ни один другой поток не будет иметь такой же идентификатор, ни сейчас, ни в будущем, пока, конечно, после перезагрузки - как -битное значение, переполнение маловероятно).

(См. Источник XNU , Источник XNU .)

Получите этот идентификатор для pthread, используя следующий код:

uint64_t GetThreadID(pthread_t thread) {
    mach_port_name_t port=pthread_mach_thread_np(thread);

    thread_identifier_info_data_t info;
    mach_msg_type_number_t info_count=THREAD_IDENTIFIER_INFO_COUNT;
    kern_return_t kr=thread_info(thread,
                                 THREAD_IDENTIFIER_INFO,
                                 (thread_info_t)&info,
                                 &info_count);
    if(kr!=KERN_SUCCESS) {
        /* you can get a description of the error by calling
         * mach_error_string(kr)
         */
        return 0;
    } else {
        return info.thread_id;
    }
}

(См. Источник XNU .)

Две ноты:

  1. Нет документации для THREAD_IDENTIFIER_INFO, или, по крайней мере, я не смог ее найти. Так что, я полагаю, строго говоря, это делает его недокументированным. Но он находится в публичных заголовках, прямо рядом с THREAD_BASIC_INFO, который задокументирован - так что я предполагаю, что это просто недосмотр. Не похоже, что документация по любому из этих материалов особенно хороша.)

  2. Я не знаю, как обстоят дела на iOS, но THREAD_IDENTIFIER_INFO и pthread_mach_thread_np оба, кажется, доступны в заголовках, так что стоит попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...