Obtenha o ID do thread em C

Jinku Hu 12 outubro 2023
  1. Use a função pthread_self para obter o ID do thread em C
  2. Use a função gettid para obter o ID do thread em C
  3. Use a função thrd_current para obter o ID do thread em C
Obtenha o ID do thread em C

Este artigo demonstrará vários métodos sobre como obter a ID do thread em C.

Use a função pthread_self para obter o ID do thread em C

Threads são a base do desempenho em CPUs contemporâneas, já que as últimas tendem a adicionar mais núcleos virtuais ou físicos hoje em dia para suportar melhores fluxos de trabalho multi-threaded. Geralmente, um thread é denotado como um único fluxo de controle em um processo (ou seja, programa em execução). Assim, os threads são usados ​​para implementar vários fluxos lógicos que seriam executados simultaneamente e formariam um programa que utiliza vários núcleos de CPU. Observe que os threads POSIX têm sido a interface padrão mais antiga para acessar recursos de threading em programas C. pthread_self é uma das funções fornecidas pela API pthreads que pode recuperar o ID do thread de chamada. Leva zero argumentos e retorna o inteiro denotando o ID do thread como a variável do tipo pthread_t.

No código de exemplo a seguir, implementamos o cenário multi-threaded básico, onde o programa principal (thread) cria quatro threads adicionais que executam a função printHello e terminam usando a chamada de função pthread_exit. Observe que cinco threads estão em execução durante este programa e todas saem depois que o caminho de código fornecido é executado. Na função printHello, todos eles imprimem seu ID de thread usando a função pthread_self.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, pthread ID - %lu\n", tid, pthread_self());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

Resultado:

Hello There! thread 1, pthread ID - 140388002486016
Hello There! thread 0, pthread ID - 140388010878720
Hello There! thread 2, pthread ID - 140387994093312
Hello There! thread 3, pthread ID - 140387985700608

Use a função gettid para obter o ID do thread em C

gettid é uma chamada de sistema específica do Linux que é fornecida usando o wrapper de função no programa C e retorna o ID de thread do chamador. A função não recebe argumentos semelhantes a pthread_self e retorna o valor inteiro do tipo pid_t. Observe que o valor retornado pela chamada gettid não é o mesmo que o ID recuperado da função pthread_self, que é chamada de ID de thread POSIX. Se o programa for de thread único, gettid retorna o mesmo valor que getpid - igual ao ID do processo.

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, kthread ID - %d\n", tid, gettid());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

Resultado:

Hello There! thread 0, kthread ID - 10389
Hello There! thread 1, kthread ID - 10390
Hello There! thread 2, kthread ID - 10391
Hello There! thread 3, kthread ID - 10392

Use a função thrd_current para obter o ID do thread em C

thrd_current é parte da API ISO C threads adicionada à especificação da linguagem padrão em 2011. Observe que esta API fornece uma interface padrão para sistemas operacionais compatíveis com POSIX e qualquer plataforma que forneça um compilador C compatível com o padrão. Assim, este método é uma forma recomendada de interagir com threads na linguagem C. Usamos as funções pthread para criar e sair das threads no exemplo a seguir, entretanto, deve-se escolher uma única interface (Pthreads ou ISO C) ao trabalhar em um projeto.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <threads.h>
#include <unistd.h>

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *threadid) {
  long tid;
  tid = (long)threadid;
  printf("Hello There! thread %ld, pthread ID - %lu\n", tid, thrd_current());
  pthread_exit(NULL);
}

int main(int argc, char const *argv[]) {
  pthread_t threads[NUM_THREADS];
  int rc;
  long t;

  for (t = 0; t < NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, printHello, (void *)t);
    if (rc) {
      printf("ERORR; return code from pthread_create() is %d\n", rc);
      exit(EXIT_FAILURE);
    }
  }
  pthread_exit(NULL);
}

Resultado:

Hello There! thread 0, pthread ID - 139727514998528
Hello There! thread 1, pthread ID - 139727506605824
Hello There! thread 2, pthread ID - 139727498213120
Hello There! thread 3, pthread ID - 139727489820416
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C Thread