Thread-ID in C ermitteln

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion pthread_self, um die Thread-ID in C zu ermitteln
  2. Mit der Funktion gettid die Thread-ID in C ermitteln
  3. Verwenden Sie die Funktion thrd_current, um die Thread-ID in C zu ermitteln
Thread-ID in C ermitteln

Dieser Artikel demonstriert mehrere Methoden, wie man die Thread-ID in C abrufen kann.

Verwenden Sie die Funktion pthread_self, um die Thread-ID in C zu ermitteln

Threads sind der Eckpfeiler der Leistung auf modernen CPUs, da diese heutzutage dazu neigen, mehr virtuelle oder physische Kerne hinzuzufügen, um bessere Multi-Thread-Abläufe zu unterstützen. Im Allgemeinen wird ein Thread als ein einzelner Kontrollfluss in einem Prozess (d. h. einem laufenden Programm) bezeichnet. Daher werden Threads verwendet, um mehrere Logikflüsse zu implementieren, die gleichzeitig ausgeführt werden und ein Programm bilden, das mehrere CPU-Kerne nutzt. Beachten Sie, dass POSIX-Threads die älteste Standardschnittstelle für den Zugriff auf Threading-Einrichtungen in C-Programmen sind. pthread_self ist eine der von der pthreads-API bereitgestellten Funktionen, die die ID des aufrufenden Threads abrufen kann. Sie nimmt null Argumente entgegen und gibt die Ganzzahl, die die Thread-ID bezeichnet, als Variable vom Typ pthread_t zurück.

Im folgenden Beispielcode haben wir das grundlegende Multi-Thread-Szenario implementiert, bei dem das Hauptprogramm (Thread) vier weitere Threads erzeugt, die die Funktion printHello ausführen und mit dem Funktionsaufruf pthread_exit beendet werden. Beachten Sie, dass in diesem Programm fünf Threads laufen, die alle nach der Ausführung des angegebenen Codepfads beendet werden. In der Funktion printHello geben alle von ihnen ihre Thread-ID mit der Funktion pthread_self aus.

#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);
}

Ausgabe:

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

Mit der Funktion gettid die Thread-ID in C ermitteln

gettid ist ein Linux-spezifischer Systemaufruf, der über den Funktions-Wrapper im C-Programm bereitgestellt wird und die Thread-ID des Aufrufers zurückgibt. Die Funktion nimmt ähnlich wie pthread_self keine Argumente entgegen und gibt den Integer-Wert vom Typ pid_t zurück. Beachten Sie, dass der vom gettid-Aufruf zurückgegebene Wert nicht derselbe ist wie die von der Funktion pthread_self abgerufene ID, die als POSIX-Thread-ID bezeichnet wird. Wenn das Programm single-threaded ist, liefert gettid den gleichen Wert wie getpid - gleich der Prozess-ID.

#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);
}

Ausgabe:

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

Verwenden Sie die Funktion thrd_current, um die Thread-ID in C zu ermitteln

thrd_current ist Teil der ISO C-Thread-API, die 2011 in die Spezifikation der Standardsprache aufgenommen wurde. Beachten Sie, dass diese API eine Standardschnittstelle für POSIX-kompatible Betriebssysteme und jede Plattform bietet, die einen standardkonformen C-Compiler bereitstellt. Daher ist diese Methode der empfohlene Weg, um mit Threads in der Sprache C zu interagieren. Im folgenden Beispiel verwenden wir die pthread-Funktionen zum Erzeugen und Beenden der Threads, allerdings sollte man sich bei der Arbeit an einem Projekt für eine einzige Schnittstelle (Pthreads oder ISO C) entscheiden.

#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);
}

Ausgabe:

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

Verwandter Artikel - C Thread