2016-08-05 54 views
0

Ich habe Array von Pthread_t in C wie folgt.Wie frei Array von Pthread_t in C frei?

pthread_t *workers;   // worker threads running tasks from queue 
workers = malloc(sizeof(pthread_t)*workers_count) 

// then I creates pthread by passing &workers[i] to pthread_create() 

Jetzt überlege ich, wie ich sie befreien sollte. ich so etwas getan:

for(int i=0; i<workers_count; i++) 
     free(workers[i]); 
    free(workers); 

Aber ist pthread_t nicht eine Struktur, die einige interne Zeiger enthalten kann, die befreit werden sollte? Vielleicht gibt es eine Funktion pthread_destroy (pthread_t *)?

+1

Solange Sie sicherstellen, dass alle Ihre Threads 'pthread_join()' oder 'pthread_detach()' enthalten, können Sie '' pthread_t * 'einfach' free() '. – EOF

Antwort

2

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.

+0

ok ich denke das frei (thread_pool-> worker); suffice, wenn ich zusätzliche für loop Freigabe habe ich bekomme SIGABR Ausnahme –

+0

@ MichałZiobro Sie haben zwei verschiedene Konstrukte in Ihrem Code; eine nackte "worker" -Variable und was * als * struct-Member 'workers' in einer bestimmten Instanz' thread_pool' erscheint. Das hilft nicht gerade dabei, Dinge zu klären. Nichtsdestoweniger ist PP hier absolut korrekt (und auf jeden Fall wertaufwärts).Geben Sie nur die "Worker" -Sequenz frei, und zwar nur dann, wenn sie dynamisch zugeordnet wurde (was in der ersten Codeliste zu sein scheint, in der zweiten unbekannt). Wenn alle Threads vorher fertig sein sollten, stellen Sie sicher, dass sie 'pthread_join' auf allen von ihnen sind, bevor sie frei sind (vorausgesetzt, sie sind verbindbar). – WhozCraig

+0

Ich bearbeite es yeah Worker Array ist innerhalb thread_pool struct, aber ich erwäge nur Deallokation von internen Array-Worker nicht Thread-Pool-Struktur –