C线程变量在从另一个线程声明后具有值

时间:2012-06-17 20:01:59

标签: c multithreading thread-safety pthreads

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

这里的孔代码有点长,所以我会粘贴一些零件。

线程正如以下参数一样打开:
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());
}
如果有人知道,请帮助我。先感谢您。

2 个答案:

答案 0 :(得分:5)

当你在函数中写这个时:

unsigned int topten[10];  

数组值未初始化为0。它们包含位于topten个位置的内存中发生的任何内容。使用topten数组中的值而不首先将自己的新值写入数组是未定义的行为。如果您希望数组填充0,则应按如下方式对其进行初始化:

unsigned int topten[10] = {0};

答案 1 :(得分:0)

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

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

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