2016-04-26 7 views
1

Ich versuche, einen zurückgegebenen Wert eines Threads zu verwenden. Dafür fand ich nur in dem folgenden Artikel: How to return a value from thread in CC Pthread, Zeiger verliert Inhalt

So verwende ich den folgenden Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

void *myThread() 
{ 
    int ret = 42; 
// printf("%d\n", ret); 
    printf("%p\n",(void*)&ret); 

    void * ptr = (void*)&ret; 
    printf("%p\n", ptr); 
    printf("%d\n", *((int *)ptr)); 
    return (void*) &ret; 
} 

int main() 
{ 
    pthread_t tid; 
    static void *status; 

// int ret = 42; 
// status = &ret; 
// printf("%d\n", *((int *)status)); 

    pthread_create(&tid, NULL, myThread, NULL); 
    pthread_join(tid, &status); 

    printf("%p\n",((int *)status)); 
    printf("%d\n", *((int *)status)); 
    return 0; 
} 

Die Ausgänge sind: 0x7f7ead136f04, 0x7f7ead136f04, , 0x7f7ead136f04,

Warum ist der letzte Wert nicht 42?

gleiches Problem hier:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

    void* aufgabe_drei_thread() { 
     int i = 5; 
     return &i; 
    } 

int main(int argc, char** argv) { 
    int* ptr_wert_aus_drei; 
    pthread_t thread_three_id; 
    pthread_create(&thread_three_id, NULL, aufgabe_drei_thread, NULL); 
    pthread_join (thread_three_id, &ptr_wert_aus_drei); 
    printf("Der Wert aus Thread 3 ist: %d\n", *((int *)ptr_wert_aus_drei)); 

    return (EXIT_SUCCESS); 
} 

Die Ausgabe ist: Der Wert aus Thema 3 ist: 32508 und nicht 5.

Was mache ich falsch?

+4

Sie können einen Zeiger auf eine lokale Variable zurück. Lokale Variablen werden zerstört, wenn die Funktion beendet ist. – Havenard

Antwort

2

Weisen Sie den Heapspeicher an, an den Wert zu hängen, oder übergeben Sie einen Zeiger, um ihn zu speichern.

Dies:

void *myThread(void *opaque) 
{ 
    int *ret = malloc(sizeof(int)); 
    *ret = 42; 
// printf("%d\n", *ret); 
    printf("%p\n",(void*) ret); 

    void * ptr = (void*) ret; 
    printf("%p\n", ptr); 
    printf("%d\n", *((int *)ptr)); 
    return (void*) ret; 
} 

Oder diese:

void *myThread(void *opaque) 
{ 
    int *ret = (int *) opaque; 
    *ret = 42; 
// printf("%d\n", *ret); 
    printf("%p\n",(void*) ret); 

    void * ptr = (void*) ret; 
    printf("%p\n", ptr); 
    printf("%d\n", *((int *)ptr)); 
    return NULL; 
} 

Während das Bestehen der Variable wie folgt aus:

pthread_create(&tid, NULL, myThread, &status); 
pthread_join(tid, NULL); 
2

i als global deklarieren, weil innerhalb aufgabe_drei_thread()i zerstört werden, wenn die Funktion beendet.

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

int i = 0; 

void* aufgabe_drei_thread() { 
    i = 42;  
    return &i; 
} 

int main(int argc, char** argv) { 
    int* ptr_wert_aus_drei; 
    pthread_t thread_three_id; 
    pthread_create(&thread_three_id, NULL, aufgabe_drei_thread, NULL); 
    pthread_join (thread_three_id, &ptr_wert_aus_drei); 
    printf("Der Wert aus Thread 3 ist: %d\n", *((int *)ptr_wert_aus_drei)); 

    return (EXIT_SUCCESS); 
} 

oder

void* aufgabe_drei_thread() {  
    return (void*) 42; 
} 

int main(int argc, char** argv) { 
    int* ptr_wert_aus_drei; 
    pthread_t thread_three_id; 
    pthread_create(&thread_three_id, NULL, aufgabe_drei_thread, NULL); 
    pthread_join (thread_three_id, &ptr_wert_aus_drei); 
    printf("Der Wert aus Thread 3 ist: %d\n", *((int *)ptr_wert_aus_drei)); 

    return (EXIT_SUCCESS); 
}