в RH Linux, каждый pthread сопоставляет pid, который можно отслеживать в таких инструментах, как htop. но как я могу получить pid потока? getpid() просто возвращает pid основного потока.
Как получить pid из pthread
Ответ 1
Можно вызвать для возврата идентификатора вызывающего потока.
Также 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.
см. здесь пример, который может вернуть реальная программа мира:
Ответ 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.