В программе linux c, как печатать идентификатор потока потока, созданного библиотекой pthread?
например: мы можем получить pid процесса getpid()
Как получить идентификатор потока pthread в программе linux c?
Ответ 1
Функция pthread_self()
даст идентификатор потока текущего потока.
pthread_t pthread_self(void);
Функция pthread_self()
возвращает дескриптор Pthread вызывающего потока. Функция pthread_self() НЕ возвращает интегральный поток вызывающего потока. Вы должны использовать pthread_getthreadid_np()
для возврата интегрального идентификатора потока.
Примечание:
pthread_id_np_t tid;
tid = pthread_getthreadid_np();
значительно быстрее, чем эти вызовы, но обеспечивает такое же поведение.
pthread_id_np_t tid;
pthread_t self;
self = pthread_self();
pthread_getunique_np(&self, &tid);
Ответ 2
Что? Человек попросил указать Linux и эквивалент getpid(). Не BSD или Apple. Ответ: gettid() и возвращает целочисленный тип. Вы должны будете вызвать его, используя syscall(), например:
#include <sys/types.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
Хотя это может быть не переносимым для систем, отличных от linux, поток данных напрямую сопоставим и очень быстро реализуется. Он может быть напечатан (например, для LOG), как нормальное целое число.
Ответ 3
Вы можете использовать pthread_self()
Родитель узнает идентификатор потока после того, как pthread_create()
выполняется успешно, но при выполнении потока, если мы хотим получить доступ к идентификатору потока, мы должны использовать функцию pthread_self()
.
Ответ 4
Как отмечено в других ответах, pthreads не определяет независимый от платформы способ получения интегрального идентификатора потока.
В системах Linux вы можете получить идентификатор потока таким образом:
#include <sys/types.h>
pid_t tid = gettid();
На многих платформах на базе BSD этот ответ fooobar.com/questions/122251/... дает не переносимый способ.
Однако если причина, по которой вам требуется идентификатор потока, заключается в том, чтобы знать, работаете ли вы в одном и том же потоке с другим потоком, которым вы управляете, вы можете найти некоторую полезность в этом подходе
static pthread_t threadA;
// On thread A...
threadA = pthread_self();
// On thread B...
pthread_t threadB = pthread_self();
if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n");
else printf("Thread B is NOT same as thread A.\n");
Если вам просто нужно знать, находитесь ли вы в основном потоке, есть дополнительные способы, задокументированные в ответах на этот вопрос как я могу определить, является ли pthread_self основным (сначала ) в процессе?.
Ответ 5
pid_t tid = syscall(SYS_gettid);
Linux предоставляет такой системный вызов, чтобы вы могли получить идентификатор потока.
Ответ 6
Эта единственная строка дает вам pid, каждый поток и spid.
printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
Ответ 7
pthread_getthreadid_np
не было на моем Mac os x. pthread_t
- непрозрачный тип. Не бейте головой. Просто назначьте его void*
и назовите это хорошо. Если вам нужно printf
использовать %p
.
Ответ 8
Существует также другой способ получения идентификатора потока. При создании потоков с
int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);
вызов функции; первый параметр pthread_t * thread
- это фактически идентификатор потока (который представляет собой unsigned long int, определенный в битах /pthreadtypes.h). Кроме того, последний аргумент void *arg
- это аргумент, который передается функции void * (*start_routine)
для void * (*start_routine)
.
Вы можете создать структуру для передачи нескольких аргументов и отправить указатель на структуру.
typedef struct thread_info {
pthread_t thread;
//...
} thread_info;
//...
tinfo = malloc(sizeof(thread_info) * NUMBER_OF_THREADS);
//...
pthread_create (&tinfo[i].thread, NULL, handler, (void*)&tinfo[i]);
//...
void *handler(void *targs) {
thread_info *tinfo = targs;
// here you get the thread id with tinfo->thread
}
Ответ 9
Независимый от платформы способ (начиная с С++ 11):
#include <thread>
std::this_thread::get_id();
Ответ 10
Я думаю, что вопрос не только неясен, но и большинство людей не осознают разницу. Изучите следующее высказывание:
Идентификаторы потоков POSIX не совпадают с идентификаторами потоков, возвращаемыми системным вызовом
gettid()
Linux. Идентификаторы потоков POSIX назначаются и поддерживаются реализацией потоков. Идентификатор потока, возвращаемыйgettid()
представляет собой число (аналогичное идентификатору процесса), назначаемое ядром. Хотя каждый поток POSIX имеет уникальный идентификатор потока ядра в реализации потокового процесса Linux NPTL, приложению, как правило, не нужно знать об идентификаторах ядра (и не будет переносимым, если зависит от их знания).Отрывок из: Интерфейс программирования Linux: Справочник по системному программированию Linux и UNIX, Майкл Керриск
ИМХО, есть только один переносимый способ, который передает структуру, в которой переменная, содержащая числа в порядке возрастания, например, 1,2,3...
для каждого потока. Делая это, ID потоков может отслеживаться. Тем не менее, следует использовать функцию int pthread_equal(tid1, tid2)
.
if (pthread_equal(tid1, tid2)) printf("Thread 2 is same as thread 1.\n");
else printf("Thread 2 is NOT same as thread 1.\n");