分段错误 - 使用 POSIX 的多线程原因数分解



我需要让一个主线程创建新线程,每个线程返回传递给它们的值的质因数数组。 例如,如果一个新线程被传递 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

最新更新