【问题标题】:C pthread, Pointer looses contentC pthread,指针丢失内容
【发布时间】:2016-04-26 22:41:29
【问题描述】:

我正在尝试使用线程的返回值。为此,我刚刚找到了以下文章: 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 线程 3 IST:32508 而不是 5。

我做错了什么?

【问题讨论】:

  • 您不能返回指向局部变量的指针。函数结束时局部变量被销毁。

标签: c pointers pthreads


【解决方案1】:

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

这个:

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

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2019-07-01
      • 2015-10-26
      • 1970-01-01
      相关资源
      最近更新 更多