Aber ist nicht pthread_t eine Struktur, die einige interne Zeiger enthalten kann, die freigegeben werden sollte?
Sie müssen sich nicht um die Sorge, was pthread_t
Struktur enthält (oder wenn es sogar ein struct
) oder, wie es umgesetzt werden. Sie (können) nur free()
was Sie zugewiesen mit malloc()
, calloc()
usw.
Vielleicht gibt es einige Funktion pthread_destroy (pthread_t *)?
Es gibt keine solche Funktion, da eine solche Funktion nicht benötigt wird.
Also, wenn Sie das Thread-IDs später für einen bestimmten Zweck benötigen ( Beitritt Sendesignal pthread_kill()
verwenden, etc.), was Sie tun, ist in Ordnung. Andernfalls müssen Sie sicherstellen, dass Sie free() an der entsprechenden Stelle in Ihrem Code (d. H. Wenn die Thread-IDs nicht mehr benötigt werden).
Ich bin mir nicht ganz sicher, wie Sie in Ihrem Code zuordnen. Hier ist ein einfaches Beispiel mit dynamischer Zuordnung von Thread-IDs, die es vielleicht etwas verdeutlichen könnte.
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void* doSomeThing(void* arg)
{
printf("From thread function: Thread ID: %ld\n", (long)pthread_self());
return NULL;
}
int main(int argc, char *argv[])
{
size_t count = 10;
pthread_t *tid;
tid = malloc(count * sizeof *tid);
for(size_t i = 0; i< count; i++) {
int rc = pthread_create(&tid[i], NULL, &doSomeThing, NULL);
if(rc) { /* failure */ }
}
for(size_t i = 0;i<count; i++) {
pthread_join(tid[i], NULL);
}
free(tid);
return 0;
}
In dem obigen Beispiel I mit Gewinde verbinden. Da die Thread-IDs für das Joyngen benötigt werden, ist die free() die tid
danach.
Auch können Sie sehen, ich rufe free()
nur einmal, weil tid
einen Block für 10 pthread_t
s zugewiesen wurde. Grundsätzlich rufen Sie free()
einmal für jeden Anruf zu malloc()
(oder calloc()
oder realloc()
) und dem der Zeiger Sie free()
passieren muss der gleichen sein, die zuvor von einer der *alloc()
Funktionen zurückgegeben wurde.
Solange Sie sicherstellen, dass alle Ihre Threads 'pthread_join()' oder 'pthread_detach()' enthalten, können Sie '' pthread_t * 'einfach' free() '. – EOF