1
私は大きなプログラムをデバッグする簡単なプログラムを作成しようとしたので、以下のプログラムと幾分似た機能を必要とするプロジェクトに取り組んでいます。私が作成しているスレッドは、期待される出力と矛盾する値を返していますが、戻り値はランダムではありません。スレッドが他のスレッドから値を返すようになったり、返される変数( "tmp")が更新されているようです。スレッドの戻り値が期待される出力と一致しません
期待される出力があるべき...
#include <stdio.h>
#include <pthread.h>
struct Numbers {
int x;
int y;
};
void *go(void* param)
{
struct Numbers* nums = (struct Numbers*) param;
int sum = nums -> x + nums -> y;
return (void*) sum;
}
int main()
{
int result[2][2];
int tmp;
pthread_t thread[2][2];
int i, j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
struct Numbers nums;
nums.x = i;
nums.y = j;
pthread_create(&thread[i][j], NULL, go, &nums);
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
pthread_join(thread[i][j], (void*) &tmp);
result[i][j] = tmp;
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d\t", result[i][j]);
}
printf("\n");
}
return 0;
}
は、スレッドがアクセスしようとする可能性がある場合に比べてnums' 'の寿命を考えてみましょう。 – GManNickG
あなたは 'nums'を保証しますか?すべてのスレッド呼び出しのために書き直されませんか? – dvhh
@GManNickG私は完璧な "オハイ"の瞬間がありました。スレッドが作成される前に(ネストされたfor-loopの外で)すべてのデータを準備する唯一の選択肢がありますか、それとも良いオプションがありますか? –