我试图使用线程的返回值。为此,我刚刚找到以下文章: 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。
我做错了什么?
答案 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);
}