【问题标题】:Segmentation fault (core dumped) error when creating thread创建线程时出现分段错误(核心转储)错误
【发布时间】:2016-10-06 16:58:35
【问题描述】:

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

这里我要创建一个线程:

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;
}

【问题讨论】:

  • 假设jint,您没有将int* 传递给pthread_create,因此primej 的构建和随后在线程过程中的取消引用是错误的。 int j = (int)prime; 更接近现实,但仍然不是“正确的”。要正确执行此操作,proc 中的j 入站和j 都应为intptr_tuintptr_t,并且无论如何都应删除free。也就是说,这都是猜测,因为我们不知道第一个 sn-p 上的 j 是什么类型,也不知道它来自哪里。

标签: c pthreads


【解决方案1】:

问题是您将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);

【讨论】:

  • 注意:应该注意线程创建器中的j 在线程最后一次使用之前不会遇到自动销毁(超出范围)。将本地自动变量的地址传递给线程创建的竞争条件很容易意外发生,并且由于其零星的故障性质,通常难以追踪。通过值传递j,例如intptr_t or unintptr_t`,或线程释放的动态内存,或许多其他选项,将防止这种情况发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2019-09-09
  • 2012-11-19
相关资源
最近更新 更多