Verwendung von die C11-Thread-Bibliothek in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion thrd_create, um einen neuen Thread zu erstellen und die angegebene Routine in C auszuführen
  2. Verwendung von die Funktion thrd_join zum auf den angegebenen Thread in C zu warten
Verwendung von die C11-Thread-Bibliothek in C

In diesem Artikel werden verschiedene Methoden zur Verwendung der C11-Thread-Bibliothek in C erläutert.

Verwenden Sie die Funktion thrd_create, um einen neuen Thread zu erstellen und die angegebene Routine in C auszuführen

Die Threading-Unterstützung war in der Standard-C-Sprachspezifikation längst überfällig und wurde schließlich in C11 realisiert. Zuvor wurde die POSIX-Thread-API als primäres Tool zur Verwendung der Multithread-Programmierung verwendet. Da der C11 eine Standardschnittstelle bietet, die ohne Plattformabhängigkeiten verwendet werden kann, wurde empfohlen, die ISO-Sprach-API als die POSIX-Version zu verwenden. Obwohl die beiden APIs in ihren Funktionsprototypen nicht übereinstimmen, sind die Hauptmerkmale größtenteils ähnlich. Im folgenden Beispiel zeigen wir das einfache Szenario, in dem vier Threads gestartet werden, um die Funktion printHello auszuführen und dann zu beenden, ohne dem Hauptthread beizutreten.

thrd_create akzeptiert drei Argumente:

  1. Der erste ist ein Zeiger auf die Thread-ID.
  2. Das zweite Argument ist vom Typ - thrd_start_t, was für einen Funktionszeiger-Prototyp nur typedef ist.
  3. Der dritte Parameter gibt ein Argument an, das an die Funktion übergeben werden kann.

Die Rückgabestatuscodes von thrd_create werden mit den Werten enum definiert: thrd_success, thrd_nomem und thrd_error.

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

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

void *printHello(void *thr_id) {
  long tid;
  tid = (long)thr_id;
  printf("Hello There! thread #%ld, pthread ID - %lu\n", tid, thrd_current());
  thrd_exit(EXIT_SUCCESS);
}

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

  for (t = 0; t < NUM_THREADS; t++) {
    rc = thrd_create(&threads[t], (thrd_start_t)printHello, (void *)t);
    if (rc == thrd_error) {
      printf("ERORR; thrd_create() call failed\n");
      exit(EXIT_FAILURE);
    }
  }
  thrd_exit(EXIT_SUCCESS);
}

Ausgabe:

Hello There! thread 0, pthread ID - 140215498864384
Hello There! thread 1, pthread ID - 140215490471680
Hello There! thread 3, pthread ID - 140215473686272
Hello There! thread 2, pthread ID - 140215482078976

Verwendung von die Funktion thrd_join zum auf den angegebenen Thread in C zu warten

thrd_join ist ein Analogon zur Funktion pthread_join und blockiert den aktuellen Thread, bis der angegebene Thread die Ausführung beendet hat. Es sind zwei Argumente erforderlich: Thread-ID und int-Zeiger, die den Speicherort angeben, an dem der Rückgabestatuscode optional gespeichert werden kann, wenn der Benutzer die gültige Adresse angibt. Wenn der thrd_join für einen Thread aufgerufen wird, der bereits getrennt oder verbunden wurde, ist das Ergebnis ein undefiniertes Verhalten. Die Funktion gibt die Werte zurück, die thrd_success oder thrd_error entsprechen.

Der nächste Beispielcode implementiert das Szenario, in dem vier Threads die Variable vom Typ atomic_int erhöhen. Schließlich druckt der Haupt-Thread, der darauf wartet, dass andere fertig sind, den endgültigen Summenwert von counter.

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

#ifndef NUM_THREADS
#define NUM_THREADS 4
#endif

atomic_int counter = 0;

enum { MAX_ITER = 1000 };

void *printHello(void *thr_id) {
  long tid;
  tid = (long)thr_id;
  printf("thread %ld started incrementing ID - %lu\n", tid, thrd_current());

  for (int i = 0; i < MAX_ITER; ++i) {
    counter += 1;
  }

  return NULL;
}

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

  for (t = 0; t < NUM_THREADS; t++) {
    rc = thrd_create(&threads[t], (thrd_start_t)printHello, (void *)t);
    if (rc == thrd_error) {
      printf("ERORR; thrd_create() call failed\n");
      exit(EXIT_FAILURE);
    }
  }

  for (t = 0; t < NUM_THREADS; t++) {
    thrd_join(threads[t], NULL);
  }
  printf("count = %d\n", counter);

  thrd_exit(EXIT_SUCCESS);
}

Ausgabe:

thread 0 started incrementing ID - 139729818216192
thread 2 started incrementing ID - 139729801430784
thread 3 started incrementing ID - 139729793038080
thread 1 started incrementing ID - 139729809823488
count = 4000
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