Verwendung von die C11-Thread-Bibliothek in C
-
Verwenden Sie die Funktion
thrd_create
, um einen neuen Thread zu erstellen und die angegebene Routine in C auszuführen -
Verwendung von die Funktion
thrd_join
zum auf den angegebenen Thread in C zu warten
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:
- Der erste ist ein Zeiger auf die Thread-ID.
- Das zweite Argument ist vom Typ -
thrd_start_t
, was für einen Funktionszeiger-Prototyp nurtypedef
ist. - 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
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