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