我需要让一个主线程创建新线程,每个线程返回传递给它们的值的质因数数组。 例如,如果一个新线程被传递 12,它需要将一个包含 223 的数组返回给主线程。 就我的代码目前而言,我不断遇到分段错误。 我不确定如何将值从新线程返回到主线程。任何帮助找出导致分段错误的原因以及如何将值返回主线程?
#include <pthread.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
void *trial_division(void *n);
int main (int argc, char** argv[])
{
while(argc > 0){
pthread_t tid;
pthread_create(&tid,NULL,trial_division,argv[argc]);
pthread_join(tid,NULL);
argc--;
}
}//end main
void *trial_division(void *n)
{
printf("I'm a new thread!n");
int value = atoi(n);
while (value%2 == 0)
{
printf("%d",2);
value = value/2;
}
for (int i = 3;i <= sqrt (value); i = i+2)
{
while (value%i == 0)
{
printf("%d",i);
value = value/i;
}
}
if (value > 2)
printf("%d",value);
printf("n");
}//end trail_division
我们先来看看代码问题:
int main(int, char***)
的第二个参数应该是char **
。- argv[] 中的第一个字符串是可执行文件的名称,因此您需要
while (argc>1) {
。 - 有了
atoi(n)
,你有一个从"void*"到"const char*"的无效转换,所以让我们投射这个:atoi( (char*) n)
- 最后,函数中没有返回 non-void 的语句。只是
return NULL;
现在是分段错误。发生这种情况是因为第一个线程是使用参数 argv[argc]
创建的,该参数不存在,因为数组索引从零开始。因此,如果您将其更改为 argv[argc-1]
,您的代码(加上上面的修改(将起作用。
更正的代码:
#include <pthread.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
void *trial_division(void *n);
int main(int argc, char* argv[]) {
while (argc > 1) {
pthread_t tid;
pthread_create(&tid, NULL, trial_division, argv[argc-1]);
pthread_join(tid, NULL);
argc--;
}
} //end main
void *trial_division(void *n) {
printf("I'm a new thread!n");
int value = atoi( (char*) n);
while (value % 2 == 0) {
printf("%d", 2);
value = value / 2;
}
for (int i = 3; i <= sqrt(value); i = i + 2) {
while (value % i == 0) {
printf("%d", i);
value = value / i;
}
}
if (value > 2)
printf("%d", value);
printf("n");
return NULL;
} //end trail_division
示例输出:
$ ./test 123 45 6789
I'm a new thread!
33173
I'm a new thread!
335
I'm a new thread!
341