2

同じメソッドを呼び出す 4 つの異なるスレッドを実行したいのですが、すべての実行が別の実行中のスレッドからのものであることを確認したいと考えています。

以下に示すコードでは、メソッド関数は予想される回数実行されますが、常に同じスレッドによって実行されます (出力される値は変更されません)。

この条件を保証するには、コードで何を変更する必要がありますか? (この例では、4 つの異なる値が出力されます)

編集:同じコードですが、ソリューションがどのようになるかを確認するための構造が含まれています

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>

struct object{
  int id;
};

void * function(void * data){

    printf("Im thread number %i\n",     data->id);
    pthread_exit(NULL);

}

int main(int argc, char ** argv){

    int i;
    int error;
    int status;
    int number_threads = 4;

    pthread_t thread[number_threads];

    struct object info;

    for (i = 0; i < number_threads; ++i){

        info.id = i;

        error = pthread_create(&thread[i], NULL, function, &info);

        if(error){return (-1);}
    }

    for(i = 0; i < number_threads; i++) {

        error = pthread_join(thread[i], (void **)&status);

        if(error){return (-1);}   
    }

}
4

3 に答える 3

2

常に同じ値が表示される理由

ポインターを整数として出力しています。data内の変数を指しiますmain。のアドレスはi変更されないため、同じ値が出力されます。

の値を出力するi

あなたがしたいのはdata、整数として逆参照することです。これに対する適切な方法は単純です: *(int *)data. これはdata、ポインターを整数にキャストし、逆参照して値を取得することを意味します。


この条件を保証するには、コードで何を変更する必要がありますか? (この例では、4 つの異なる値が出力されます)

の値を印刷しても、4 つの異なる値が印刷されるとi は限りません。

  • 4 つすべてが作成され、メインのスレッドがjoin(). その場合、すべてのスレッドが出力されます0

  • スレッド 1 と 2 が を読み取りi = 2、スレッド 3 と 4 が を読み取る可能性がありますi = 3。または、これの他の組み合わせ。

異なる値を確実に出力する方法

これを適切に行うには、各スレッドに異なるパラメーターを渡す必要があります。一番きれいなのはこのようなものです。

int thread_number[4] = {0, 1, 2, 3};
// ...
error = pthread_create(&thread[i], NULL, function, &thread_number[i]);
于 2015-04-30T22:22:09.353 に答える
1

修正してみる

printf("Im thread number %i\n", data);

printf("Im thread number %i\n", *((int *)data));
于 2015-04-30T22:19:47.797 に答える
1

4 つのスレッドすべてにアドレスを渡していますが、これは望んでいないものであり、競合状態iにつながります。単に値を渡し、すべてのスレッドでそれらを出力したい場合は、次のように渡します。i

error = pthread_create(&thread[i], NULL, function, (void *)i);

印刷行を次のように変更します。

printf("Im thread number %i\n", (int)data);
于 2015-04-30T22:20:37.680 に答える