Ich habe eine Frage zur Parallelprogrammierung in C.
In der pthread-Bibliothek ist der Prototyp von pthread_join ist
int pthread_join(pthread_t tid, void **ret);
und der Prototyp von pthread_exit ist:
void pthread_exit(void *ret);
Also ich bin verwirrt, warum pthread_join nimmt den Rückgabewert des Prozesses als Zeiger auf a void Zeiger aus geerntetem Thread, aber pthread_exit dauert nur a void Zeiger aus dem beendeten Thread? Ich meine, im Grunde sind sie alle Rückgabewerte eines Threads, warum gibt es einen Unterschied im Typ?
stefanB
Im pthread_exit, ret ist ein Eingabeparameter. Sie übergeben einfach die Adresse einer Variablen an die Funktion.
Im pthread_join, ret ist ein Ausgabeparameter. Sie erhalten einen Wert von der Funktion zurück. Dieser Wert kann beispielsweise eingestellt werden NULL.
Lange Erklärung:
Im pthread_joinerhalten Sie die übergebene Adresse zurück pthread_exit am fertigen Faden. Wenn Sie nur einen einfachen Zeiger übergeben, wird er als Wert übergeben, sodass Sie nicht ändern können, wohin er zeigt. Um den Wert des an pthread_join übergebenen Zeigers ändern zu können, muss dieser selbst als Zeiger übergeben werden, also als Zeiger auf einen Zeiger.
Aber warum ret in definieren pthread_exit a void * Typ, es ist immer NULL oder einige andere konstante Werte
– steinhart
13. Februar 2014 um 8:22 Uhr
Jeegar Patel
Es, weil jedes Mal
void pthread_exit(void *ret);
wird von der Thread-Funktion aufgerufen, also was auch immer Sie wollen, geben Sie einfach seinen Zeiger mit pthread_exit() weiter.
Jetzt bei
int pthread_join(pthread_t tid, void **ret);
wird immer von dort aus aufgerufen, wo der Thread erstellt wird, also akzeptieren Sie hier den zurückgegebenen Zeiger, den Sie benötigen Doppelzeiger ..
Ich denke, dieser Code wird Ihnen helfen, dies zu verstehen
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
void* thread_function(void *ignoredInThisExample)
{
char *a = malloc(10);
strcpy(a,"hello world");
pthread_exit((void*)a);
}
int main()
{
pthread_t thread_id;
char *b;
pthread_create (&thread_id, NULL,&thread_function, NULL);
pthread_join(thread_id,(void**)&b); //here we are reciving one pointer
value so to use that we need double pointer
printf("b is %s\n",b);
free(b); // lets free the memory
}
Warum müssen Sie free(b) angeben, wenn es in main() steht? Liegt das daran, dass Sie eine auf dem Heap zugewiesen haben?
– M. Smith
1. Oktober 2020 um 4:12 Uhr
Die typische Verwendung ist
void* ret = NULL;
pthread_t tid = something; /// change it suitably
if (pthread_join (tid, &ret))
handle_error();
// do something with the return value ret
14021000cookie-checkpthread_join() und pthread_exit()yes