C pthread,指针丢失了内容

时间:2016-04-26 22:41:30

标签: c pointers pthreads

我试图使用线程的返回值。为此,我刚刚找到以下文章: How to return a value from thread in C

所以我使用以下代码:

#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;
}

产出是: 0x7f7ead136f04, 0x7f7ead136f04, 的 42 下, 0x7f7ead136f04, 的 0

为什么最后一个值不是42?

同样的问题:

#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);
}

输出为:Der Wert aus Thread 3 ist:32508  而不是5。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

在堆上分配以挂起值,或传递指针来存储它。

此:

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;
}

或者这个:

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;
}

传递这样的变量时:

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

答案 1 :(得分:2)

i声明为全局,因为当函数退出时,aufgabe_drei_thread() i内部将被销毁。

#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);
}

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);
}