1

我正在尝试在 C 中做一些简单的事情,但我很困惑。程序很简单,主要功能是根据作业队列结构处理线程。它一次最多打开 4 个线程。大约300个线程直到结束。线程函数始终相同,但参数不同。

孔代码有点长,粘贴在这里,所以我将粘贴一些部分。

使用以下参数打开线程:
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
pthread_create(&pth, &attr, dothejob, (void *) varis);
线程调用函数
void *dothejob(void * varis){
unsigned char * arr1;
arr1 = (unsigned char*) calloc(3000000, sizeof (unsigned char));
unsigned char * arr2;
arr2 = (unsigned char*) calloc(3000000, sizeof (unsigned char));
// doing some calculations and comparisons and stuff
unsigned int topten[10];  
// <---- here topten has some values from previous threads, but why ? 
// picking top ten and putting it in the var topten[
free(arr1);
free(arr2);
pthread_detach(pthread_self());
}
如果有人知道,请帮助我。先感谢您。
4

2 回答 2

5

当您在函数中编写此代码时:

unsigned int topten[10];  

数组值未初始化为0。它们包含内存中位置topten指向的任何内容。topten使用数组中的值而不先将自己的新值写入数组是未定义的行为。如果你想让你的数组用0s 填充,你应该像这样初始化它:

unsigned int topten[10] = {0};
于 2012-06-17T20:09:54.863 回答
0

topten是一个自动数组并在堆栈上分配。原则上,自动变量是未初始化的,它们的内容可以是之前堆栈中的任何内容。同样默认情况下,当您没有为新线程显式指定堆栈空间时,pthreads会自动管理此空间,并且可以将已加入线程的堆栈空间重用于新线程。

您创建的第一个线程为其堆栈获取一些新映射的内存,并且该内存由操作系统(或线程库)归零。后来的线程重用这个空间,它不再归零。

始终显式初始化自动变量和数组!

于 2012-06-17T20:51:56.467 回答