如何使用从线程函数返回到 main 中的结构指针?
How to use a struct pointer returned to the in the main from a thread function?
我正在编写一个将整数作为命令行参数的程序。对于这些数字中的每一个,我都必须创建一个线程来计算直到该数字的斐波那契数列。该函数 return 是指向打印数据的主函数的结构指针。
现在,我已经正确地完成了 fib 计算,并通过在函数中打印系列来检查它们。
当我尝试 return 在线程函数中创建的结构指针并使用它在 main 中打印数据时出现问题。
typedef struct thread_func_param
{
int *fib;
int size;
} thread_func_param;
//===================================================
void *fibGen(void *parameters)
{
int num = atoi(parameters);
struct thread_func_param *p;
p = malloc (sizeof (thread_func_param));
p->size = fibSize(num);
p->fib = malloc(sizeof(int)* p->size);
//Fibonacci Calculations
//..
//.
return (void *) p;
//pthread_exit((void *) p);
}
//===================================================
int main(int argc, char* argv[])
{
void* thread_result;
thread_func_param* p = malloc( sizeof(thread_func_param));
assert(argc > 1);
int noOfThreads = argc - 1;
printf("No of Thread = %d\n", noOfThreads);
pthread_t *threadID = malloc (sizeof (pthread_t) * noOfThreads);
pthread_attr_t attributes;
pthread_attr_init(&attributes);
int i, j;
for(i = 0; i < noOfThreads; i++)
{
pthread_create(&threadID[i], &attributes, fibGen, argv[i+1]);
pthread_join(threadID[i], thread_result);
//HOW TO USE THE RETURNED DATA?
for (j = 0; j< ((thread_func_param*)thread_result->size)-1; j++)
printf(" %d ", (thread_func_param*)thread_result->fib[j]);
}
return 0;
}
我最终使用的打印数据的解决方案给出了取消引用 void 指针的错误(我是 C 的新手)。我该如何更正它?
这里有两个问题:
pthread_join()
将 void**
作为第二个参数。该代码仅传递 void*
。
要转换指针,请将其包裹在括号中。这里的演员表
(thread_func_param*)thread_result->size
指的是 size
而不是 thread_result
。所以你想要的是
((thread_func_param*)thread_result)->size
然而,一个漂亮而干净的解决方案只会临时使用 void
指针。它可能看起来像这样:
int main(int argc, char* argv[])
{
thread_func_param* thread_result;
...
...
pthread_create(&threadID[i], &attributes, fibGen, argv[i+1]);
{
void * pv;
pthread_join(threadID[i], &pv);
thread_result = pv;
}
if (NULL != thread_result) /* perform some sanity checking. */
{
for (j = 0; j < thread_result->size - 1; j++)
printf(" %d ", thread_result->fib[j]);
}
...
我正在编写一个将整数作为命令行参数的程序。对于这些数字中的每一个,我都必须创建一个线程来计算直到该数字的斐波那契数列。该函数 return 是指向打印数据的主函数的结构指针。
现在,我已经正确地完成了 fib 计算,并通过在函数中打印系列来检查它们。
当我尝试 return 在线程函数中创建的结构指针并使用它在 main 中打印数据时出现问题。
typedef struct thread_func_param
{
int *fib;
int size;
} thread_func_param;
//===================================================
void *fibGen(void *parameters)
{
int num = atoi(parameters);
struct thread_func_param *p;
p = malloc (sizeof (thread_func_param));
p->size = fibSize(num);
p->fib = malloc(sizeof(int)* p->size);
//Fibonacci Calculations
//..
//.
return (void *) p;
//pthread_exit((void *) p);
}
//===================================================
int main(int argc, char* argv[])
{
void* thread_result;
thread_func_param* p = malloc( sizeof(thread_func_param));
assert(argc > 1);
int noOfThreads = argc - 1;
printf("No of Thread = %d\n", noOfThreads);
pthread_t *threadID = malloc (sizeof (pthread_t) * noOfThreads);
pthread_attr_t attributes;
pthread_attr_init(&attributes);
int i, j;
for(i = 0; i < noOfThreads; i++)
{
pthread_create(&threadID[i], &attributes, fibGen, argv[i+1]);
pthread_join(threadID[i], thread_result);
//HOW TO USE THE RETURNED DATA?
for (j = 0; j< ((thread_func_param*)thread_result->size)-1; j++)
printf(" %d ", (thread_func_param*)thread_result->fib[j]);
}
return 0;
}
我最终使用的打印数据的解决方案给出了取消引用 void 指针的错误(我是 C 的新手)。我该如何更正它?
这里有两个问题:
pthread_join()
将void**
作为第二个参数。该代码仅传递void*
。要转换指针,请将其包裹在括号中。这里的演员表
(thread_func_param*)thread_result->size
指的是
size
而不是thread_result
。所以你想要的是((thread_func_param*)thread_result)->size
然而,一个漂亮而干净的解决方案只会临时使用 void
指针。它可能看起来像这样:
int main(int argc, char* argv[])
{
thread_func_param* thread_result;
...
...
pthread_create(&threadID[i], &attributes, fibGen, argv[i+1]);
{
void * pv;
pthread_join(threadID[i], &pv);
thread_result = pv;
}
if (NULL != thread_result) /* perform some sanity checking. */
{
for (j = 0; j < thread_result->size - 1; j++)
printf(" %d ", thread_result->fib[j]);
}
...