1

Cで簡単なことをしようとしていますが、混乱しています。プログラムはシンプルで、main 関数はジョブ que 構造体に従ってスレッドを処理します。一度に最大 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];  

配列値は に初期化されていません0toptenこれらには、指している場所でたまたまメモリ内にあるものがすべて含まれています。topten最初に独自の新しい値を配列に書き込まずに、配列の値を使用することは未定義の動作です。配列を s で埋めたい場合は、次0のように初期化する必要があります。

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

topten自動配列であり、スタックに割り当てられます。原則として、自動変数は初期化されておらず、その内容は以前にスタックにあったものから何でもかまいません。また、デフォルトでは、新しいスレッドのスタックスペースを明示的に指定しない場合、pthreadsこのスペースを自動的に管理し、すでに結合されているスレッドのスタックスペースを新しいスレッドに再利用できます。

作成する最初のスレッドは、スタック用に新たにマップされたメモリを取得し、そのメモリはオペレーティングシステム(またはスレッドライブラリ)によってゼロにされます。後のスレッドはこのスペースを再利用し、ゼロ化されなくなります。

常に明示的に自動変数と配列を初期化してください!

于 2012-06-17T20:51:56.467 に答える