POSIX 返回并打印数组 prthread_join()?
POSIX returning and printing array prthread_join()?
我正在寻找多个数字的质因数分解。如果用户键入 15 80 77,它将为每个输入创建一个线程,并使线程 return 成为一个分解数组,然后将其打印出来。但是我收到两个错误。一个说错误:取消引用 'void *' 指针 [Werror]
printf("%d", return值[r]);
还有一个说错误:void 表达式的无效使用
printf("d ", return值[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);
}
您在代码段中犯了几个错误。
main
函数中的 argc
包含命令行参数的数量,包括脚本名称。所以你不想将第一个命令行参数解析为整数值。
for(r = 0; r < sizeof(returnValue); r++)
中的 sizeof
运算符为您提供 returnValue
变量的字节数,在 64 位 OS 中应始终为 8,因为它是一个指针值。使用其他方式获取结果数组的大小。
- 您收到的警告是因为类型误用。进行显式类型转换以修复它。
我正在寻找多个数字的质因数分解。如果用户键入 15 80 77,它将为每个输入创建一个线程,并使线程 return 成为一个分解数组,然后将其打印出来。但是我收到两个错误。一个说错误:取消引用 'void *' 指针 [Werror] printf("%d", return值[r]);
还有一个说错误:void 表达式的无效使用 printf("d ", return值[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);
}
您在代码段中犯了几个错误。
main
函数中的argc
包含命令行参数的数量,包括脚本名称。所以你不想将第一个命令行参数解析为整数值。for(r = 0; r < sizeof(returnValue); r++)
中的sizeof
运算符为您提供returnValue
变量的字节数,在 64 位 OS 中应始终为 8,因为它是一个指针值。使用其他方式获取结果数组的大小。- 您收到的警告是因为类型误用。进行显式类型转换以修复它。