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?

Author: Kevin, 2011-12-15

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.

 36
Author: stefanB,
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

}
 27
Author: Jeegar Patel,
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
 3
Author: Basile Starynkevitch,
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