2

プロセスに渡された引数に基づいて多数のスレッドを作成するプロセスがあります。

producer_threads[num_threads];
for (id = 0; id < num_threads; id++)
{
    printf("%d\n", id);
    pthread_create(&producer_threads[id], NULL, &produce, (void *) &id);
}

各スレッドはプロデュース関数に入り、IDをローカル変数として格納します

void* produce (void* args)
{
    int my_id = * (int*) args;
    printf("Thread %d started to produce\n", my_id);
}

しかし、私が受け取る出力は次のとおりです

0
1
Thread <n> started to produce
Thread <n> started to produce

nはランダムに0、1、または2のいずれかです。グローバル変数がローカルに割り当てられる前に更新されているためでない限り、問題の原因はわかりません。または、「ローカル変数」がスレッド間で共有されているためです。

4

2 に答える 2

3

問題は、各スレッドに同じ変数へのポインターを渡していることです。これにより競合状態が発生し、各スレッドから見た変数の値は正確なタイミングに依存します。

スレッド引数をポインタではなく値で渡す場合、これで問題が解決します。

于 2012-06-05T20:43:29.803 に答える
2

整数は、スタック変数ではなく、割り当てられた変数である必要があります。スタック上のメモリ位置へのポインタを渡すため、結果はタイミングによって異なります(つまり、競合状態です)。各pthread_create呼び出しに異なる変数を渡す必要があります。

于 2012-06-05T20:45:13.887 に答える