Подтвердить что ты не робот

Как получить идентификатор потока pthread в программе linux c?

В программе linux c, как печатать идентификатор потока потока, созданного библиотекой pthread?

например: мы можем получить pid процесса getpid()

4b9b3361

Ответ 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");