pthread join() i pthread exit()
Mam pytanie dotyczące programowania współbieżnego w C.
W bibliotece pthread prototyp pthread_join
to
int pthread_join(pthread_t tid, void **ret);
A prototyp pthread_exit
to:
void pthread_exit(void *ret);
Więc jestem zdezorientowany, dlaczego pthread_join
pobiera wartość zwracaną procesu jako wskaźnik do void
WSKAŹNIKA z reaped thread, ale pthread_exit
pobiera tylko void
Wskaźnik z zakończonego wątku? Chodzi mi o to, że w zasadzie wszystkie są wartościami zwrotnymi z wątku, dlaczego jest różnica w typie?
3 answers
W pthread_exit
, ret
jest parametrem wejściowym. Po prostu przekazujesz adres zmiennej do funkcji.
W pthread_join
, ret
jest parametrem wyjściowym. Otrzymujesz wartość z funkcji. Taką wartość można na przykład ustawić na NULL
.
Długie Wyjaśnienie:
W pthread_join
, otrzymujesz z powrotem adres przekazany do pthread_exit
przez gotowy wątek. Jeśli przekazujesz zwykły wskaźnik, jest on przekazywany przez wartość, więc nie możesz zmienić miejsca, w którym wskazuje. Aby móc zmienić wartość wskaźnik przekazany do pthread_join, musi być przekazany jako sam wskaźnik, czyli wskaźnik do wskaźnika.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 16:39:29
To dlatego, że za każdym razem
void pthread_exit(void *ret);
Zostanie wywołana z funkcji thread, która zawsze będzie zwracana po prostu za pomocą pthread_exit().
Teraz w
int pthread_join(pthread_t tid, void **ret);
Będzie zawsze wywoływane z miejsca utworzenia wątku, więc tutaj aby zaakceptować zwrócony wskaźnik potrzebujesz podwójnego wskaźnika ..
Myślę, że ten kod pomoże Ci to zrozumieć
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
void* thread_function(void)
{
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",b);
free(b); // lets free the memory
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-14 09:22:29
Typowe zastosowanie to
void* ret = NULL;
pthread_t tid = something; /// change it suitably
if (pthread_join (tid, &ret))
handle_error();
// do something with the return value ret
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-15 01:13:25