【发布时间】:2018-08-12 15:41:09
【问题描述】:
我试图找到多个数字的素数分解。如果用户键入 15 80 77,它将为每个输入创建一个线程,并让线程返回一个分解数组,然后将其打印出来。但是我收到两个错误。一个说错误:取消引用'void *'指针[Werror] printf("%d", returnValue[r]);
还有一个说错误:无效使用无效表达式 printf("d", returnValue[r]);
我对指针并不熟悉。任何帮助是极大的赞赏。这也是我的第一个问题,请耐心等待。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct _thread_data_t {
int tid;
} thread_data_t;
void *runner(void *param);
int main(int argc, char *argv[]) {
pthread_t thr[argc];
pthread_attr_t attr;
int i, rc;
//int *primeFactor;
//primeFactor = (int *)malloc(sizeof(int)*argc);
//thread_data_t thr_data[argc];
printf("Prime Numbers: ");
//Get the default attributes
pthread_attr_init(&attr);
//creat the thread
for(i = 0; i < argc; ++i){
//thr_data[i].tid = i;
if ((rc = pthread_create(&thr[i],&attr,runner,argv[i]))){
fprintf(stderr, "error: pthread_create, rc: %d\n", rc);
return EXIT_FAILURE;
}
}
//Wait for the thread to exit
for(i = 0; i<argc; ++i){
void *returnValue;
int r = 0;
pthread_join(thr[i], &returnValue);
for(r = 0; r < sizeof(returnValue); r++){
printf("%d ", returnValue[r]);
}
}
printf("\nComplete\n");
}
//The Thread will begin control in this function
void *runner(void *param) {
int *primeFactors;
int num = atoi(param);
primeFactors = (int *)malloc(sizeof(int)*num);
int i, j, isPrime;
int k = 0;
for(i=2; i<=num; i++)
{
if(num%i==0)
{
isPrime=1;
for(j=2; j<=i/2; j++)
{
if(i%j==0)
{
isPrime = 0;
break;
}
}
if(isPrime==1)
{
primeFactors[k] = i;
k++;
}
}
}
//Exit the thread
// pthread_exit(0);
// pthread_exit((void *)primeFactors);
pthread_exit(primeFactors);
}
【问题讨论】:
-
您必须先将
void*转换为它的实际类型(在本例中为int*),然后才能取消引用它 -
很抱歉,我不太了解它的工作原理。介意展示一下它的样子吗?
标签: c pthreads posix pthread-join