创建线程时出现分段错误(核心转储)错误

时间:2016-10-06 16:58:35

标签: c pthreads

我不确定如何调试此错误,因为它可能是由很多事情引起的。我能够做的是注释掉程序的各个部分并重复编译它,以便跟踪程序的哪个部分产生错误,我认为这部分会产生错误:

这里我想创建一个帖子:

int j = 0; //not the actual value, just showing that j is of type int
pthread_create(&thread_id, NULL, strikeMultiples, (void*)j);

也许它也可能是由strikeMultiples函数引起的,它在创建线程时被调用:

static void* strikeMultiples(void* prime) {
    int * primej = (int *) prime;
    int j = *primej;
    free (prime);
    int k;
    for (k = 2; j * k <= NROF_SIEVE; k++) {
        BIT_CLEAR(buffer[(j * k)/64], (j * k)%64);
    }
    return NULL;
}

1 个答案:

答案 0 :(得分:2)

问题是您将int传递给该函数(已转换为void *),然后尝试将其作为int *读取。

此外,您正在尝试free未从malloc和家人返回的内容。

传递int值的地址,并在功能中不要free。此外,没有必要在void *和任何非函数指针之间进行转换。

static void* strikeMultiples(void* prime) {
    int *primej = prime;
    int j = *primej;
    int k;
    for (k = 2; j * k <= NROF_SIEVE; k++) {
        BIT_CLEAR(buffer[(j * k)/64], (j * k)%64);
    }
    return NULL;
}

...

pthread_create(&thread_id, NULL, strikeMultiples, &j);