Как получить pid из pthread

в RH Linux, каждый pthread сопоставляет pid, который можно отслеживать в таких инструментах, как htop. но как я могу получить pid потока? getpid() просто возвращает pid основного потока.

Ответ 1

pthread_self();

Можно вызвать для возврата идентификатора вызывающего потока.

Также PID - это идентификатор процесса, поток имеет поток Id не PID. Все потоки, выполняющиеся в одном и том же процессе, будут иметь одинаковый PID.

Ответ 2

Есть два значения потоков, которые запутываются. pthread_self() вернет идентификатор потока POSIX; gettid() вернет идентификатор потока ОС. Последний является специфичным для Linux и не гарантированно переносимым, но, вероятно, тем, что вы действительно ищете.

EDIT Как отмечает PlasmaHH, gettid() вызывается через syscall(). На странице syscall() man:

   #define _GNU_SOURCE
   #include <unistd.h>
   #include <sys/syscall.h>
   #include <sys/types.h>

   int
   main(int argc, char *argv[])
   {
       pid_t tid;

       tid = syscall(SYS_gettid);
   }

Ответ 3

PID - это идентификатор процесса, а не идентификатор потока. Очевидно, что потоки, выполняемые в одном и том же процессе, будут связаны с одним и тем же PID.

Поскольку pthreads пытается быть переносимым, вы не можете напрямую получить идентификатор основного потока ОС. Возможно даже, что нет основного потока ОС.

Ответ 4

pthread_self не получает tid. он указывает дескриптор или указатель типа pthread_t для использования в функциях pthread.

см. здесь пример, который может вернуть реальная программа мира:

http://www.c-plusplus.de/forum/212807-full

Ответ 5

Фактически pthread_self return pthread_t, а не целочисленный идентификатор потока, с которым вы можете работать, следующая вспомогательная функция поможет вам переноситься в разных системах POSIX.

uint64_t gettid() {
    pthread_t ptid = pthread_self();
    uint64_t threadId = 0;
    memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid)));
    return threadId;
}

Ответ 6

Я думаю, что функция, которую вы ищете, pthread_self

Ответ 7

В потоках есть тиды (threadIds), и все потоки выполняются в одном и том же процессе (pid). Итак, ваши потоки должны иметь один и тот же pid, предполагая, что они созданы в том же процессе, и они будут иметь разные значения.

pthread_self() дает tid, а getpid() получает pid.