como obter o id do thread de um pthread no programa linux c?

94

No programa linux c, como imprimir o id do thread de um thread criado pela biblioteca pthread?
por exemplo: podemos obter pid de um processo porgetpid()

Ravi Chandra
fonte

Respostas:

81

pthread_self() função fornecerá o id do thread atual.

A pthread_self()função retorna o identificador Pthread do thread de chamada. A função pthread_self () NÃO retorna a thread integral da thread de chamada. Você deve usar pthread_getthreadid_np()para retornar um identificador integral para o segmento.

NOTA:

é significativamente mais rápido do que essas chamadas, mas fornece o mesmo comportamento.

Abhitesh khatri
fonte
38
A pergunta original era sobre o Linux. O Linux não inclui as funções _np. (Não inclui as páginas de manual, não verifiquei nada além disso.)
Trade-Ideas Philip,
pthread_threadid_np está disponível no OS X> = 10.6 e iOS> = 3.2.
bleater
@Bleater Você pode fornecer a documentação oficial do pthread_threadid_np. Preciso usar para um projeto, então preciso verificar a confiabilidade dessa API nas plataformas iOS e OSX. Consulte o link em opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.h, mas não tenho certeza se eles são os corretos.
Vivek Maran
@Vivek Não tenho nenhum link para os documentos oficiais, apenas o cabeçalho que você vincula e a fonte em opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.c
bleater
10
@ Trade-IdeasPhilip - Para esclarecer, _npsignifica não portátil. O Linux tem seu próprio _npmaterial, mas não inclui o da Apple pthread_getthreadid_np.
Josh Kelley
85

O que? A pessoa solicitou algo específico do Linux e o equivalente a getpid (). Não é BSD ou Apple. A resposta é gettid () e retorna um tipo integral. Você terá que chamá-lo usando syscall (), assim:

Embora isso possa não ser portátil para sistemas não Linux, o threadid é diretamente comparável e muito rápido de adquirir. Ele pode ser impresso (como para LOGs) como um número inteiro normal.

Evan Langlois
fonte
11
Esta deve ser a resposta verdadeira
Matthew S
A pessoa perguntou sobre algo que funcionava no Linux. Fazer isso de forma portátil me parece a maneira preferível de fazer isso. Se a portabilidade não conta para nada, então acho que o Linux está realmente se tornando o novo Windows ...
Jasper Siepkes
3
@Jasper Siepkes Você está perdendo o ponto. Ele pediu uma chamada LINUX equivalente a getpid () para threads. Isso é gettid (). A pergunta não era sobre portabilidade ou POSIX. Muitas pessoas querem se exibir e tentar ensinar, em vez de fazer a pergunta conforme solicitado. pthread_self () não retorna o id do thread do kernel e não é manipulável de uma forma que facilite a impressão. Além disso, pthread_self é provavelmente um ponteiro e não deve ser manipulado, apenas comparado com pthread_equal (). A pergunta feita para um ID que você pode imprimir e isso é gettid ().
Evan Langlois
3
@EvanLanglois Ele está trabalhando com a biblioteca pthread, literalmente a biblioteca de threads POSIX. Fazer uma resposta compatível com POSIX não é tão estranho. "Ele pediu uma chamada LINUX equivalente a getpid () para threads." Não, getpid()foi dado como exemplo. Não disse que a semântica era uma especificação difícil. Conscientizar as pessoas sobre como fazer as coisas de uma maneira compatível com POSIX para que outras comunidades além do Linux (como FreeBSD, Illumos, OS X, etc.) possam se beneficiar delas não é "se exibir". Como eu disse, acho que o Linux realmente se tornou o próximo Windows.
Jasper Siepkes
14

Conforme observado em outras respostas, pthreads não define uma maneira independente de plataforma para recuperar um ID de thread integral.

Em sistemas Linux, você pode obter o ID do thread assim:

Em muitas plataformas baseadas em BSD, esta resposta https://stackoverflow.com/a/21206357/316487 oferece uma forma não portátil.

No entanto, se a razão pela qual você acha que precisa de um ID de thread é saber se você está executando no mesmo thread ou em outro thread que você controla, você pode encontrar alguma utilidade nesta abordagem

Se você só precisa saber se está no thread principal, existem maneiras adicionais, documentadas nas respostas a esta pergunta, como posso saber se pthread_self é o thread principal (primeiro) no processo? .

baleia
fonte
13

O Linux fornece tal chamada de sistema para permitir que você obtenha a id de um thread.

Weiqi Gu
fonte
De acordo com esta resposta , você precisa #include <unistd.h>e #include <sys/syscall.h>para isso.
ComFreek
9

Você pode usar pthread_self()

O pai consegue saber o id do thread após pthread_create()ser executado com sucesso, mas durante a execução do thread, se quisermos acessar o id do thread, temos que usar a função pthread_self().

Jeff
fonte
7

Esta única linha dá a você pid, cada threadid e spid.

nandan
fonte
3

pthread_getthreadid_npnão estava no meu Mac os x. pthread_té um tipo opaco. Não bata sua cabeça nisso. Basta atribuí-lo void*e chamá-lo de bom. Se você precisar printfusar %p.


fonte
1
Sim, isso funciona. Tudo que eu preciso é imprimi-lo para depuração, então 0x23423423423abcdef é tão útil quanto tid = 1234. Obrigado!
Qi Fan
3

Acho que não apenas a questão não está clara, mas a maioria das pessoas também não está ciente da diferença. Examine o seguinte ditado,

Os IDs de encadeamento POSIX não são iguais aos IDs de encadeamento retornados pela gettid()chamada de sistema específica do Linux . Os IDs de thread POSIX são atribuídos e mantidos pela implementação do threading. O ID do thread retornado por gettid()é um número (semelhante a um ID do processo) que é atribuído pelo kernel. Embora cada thread POSIX tenha um ID de thread de kernel exclusivo na implementação de threading NPTL do Linux, um aplicativo geralmente não precisa saber sobre os IDs de kernel (e não será portável se depender de conhecê-los).

Extraído de: The Linux Programming Interface: A Linux and UNIX System Programming Handbook, Michael Kerrisk

IMHO, só existe uma forma portátil de passar uma estrutura na qual define uma variável que contém números de forma ascendente, por exemplo, 1,2,3... por thread. Fazendo isso, o id dos tópicos pode ser monitorado. No entanto, a int pthread_equal(tid1, tid2)função deve ser usada.

snr
fonte
Essa gettid()é realmente uma boa sugestão, obrigado! No entanto, eu precisava seguir a resposta de Sergey L. aqui: stackoverflow.com/a/21280941/2430526
SRG
1

Também existe outra maneira de obter o id do thread. Ao criar tópicos com

int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);

chamada de função; o primeiro parâmetro pthread_t * threadé na verdade um id de thread (que é um int longo sem sinal definido em bits / pthreadtypes.h). Além disso, o último argumento void *argé o argumento que é passado para a void * (*start_routine)função a ser encadeada.

Você pode criar uma estrutura para passar vários argumentos e enviar um ponteiro para uma estrutura.

emre pode
fonte
-1

Você também pode escrever dessa maneira e ela faz o mesmo. Por exemplo:

Este programa configura um array de pthread_t e calcula a soma de cada um. Portanto, ele está imprimindo a soma de cada thread com o id do thread.

Pranav Kumar
fonte
Não responde à pergunta e até mesmo a descrição do código está errada!
U. Windl de
-2

A forma independente de plataforma (a partir de c ++ 11) é:

Oleg Oleg
fonte
isso provavelmente não é tão "independente de plataforma" quanto você pensa. na minha implementação, ele resolve a pthread_t. Em um mac isso será um ponteiro e no Linux um inteiro. Também não reflete o id "nativo" que você pode ver, toppor exemplo. Algo a ter em conta, mas talvez seja bom para alguns usos.
Brad Allred
1
Em C11 (a pergunta era sobre C), você usaria thrd_current () de threads.h
jerry