2012-03-25 9 views
3

私はのpthread引数

doRowOffset[0] = 0; 
for(threads = 1; threads < NUMTHREADS; threads++){ 
     doRowOffset[threads] = threads; 
     printf("Do row: %d\n", doRowOffset[threads]); 
     pthread_create(&threadHandler[threads], NULL, multiplyRows, (void *) &doRowOffset[threads]); 
} 

void * multiplyRows(void * dealWithRows){ 
     int offset = *((int *) dealWithRows); 
     printf("%d\n", *((int *) dealWithRows)); 
     printf("Offset: %d\n", offset); 
     printf("Size: %d\n", partitionSize/NUMTHREADS); 
     printf("Calculated Offset: %d\n", offset*partitionSize/NUMTHREADS); 
     ... 

を以下している、新しいスレッドに渡す引数に問題が生じていますが今、私は次のように出力

が行を行います見ることを期待します。 1
オフセット:1
サイズ:2
計算されたオフセット:2

しかし、スレッドに入ると、私は引数の受け渡しに間違っているのですか?dealWithRowsの値は0になりますか?

+1

doRowOffsetの定義を投稿してください。私はそれが 'int'だと思っているが、確かに良い。 – gbulmer

答えて

2

は、あなたが変更された変数のアドレスを渡した場合、あなたはそれはおそらく何が起こっているあなた:-)

に変更される可能性があることを期待しなければならないということですdoRowOffsetを1(たとえば)に設定してからスレッドを開始します。そのスレッドが起動してそのポインタを参照解除する前に、次のスレッドのためにdoRowOffsetを変更します。

次に、最初のスレッドが最終的にアドレスを逆参照すると、元の値が変更されました。

これには2通りの方法があります。最初は、メインスレッドと子スレッドを同期させて、子が変数を逆参照してローカルに値を格納するまで待つようにします。その後、メインスレッドは、次に起動するスレッドの変数を変更します。しかし、そのような種類のスレッドの目的を敗北:

もう1つは、実際の整数値(アドレスではない)をスレッド関数に渡されるvoidポインタにキャストすることです。これは、値がアドレスではなくスレッド関数のスタックにコピーされ、メインスレッドがそれに影響を与えることができないことを意味します。

ような何か:子スレッドで

int offset = (int) dealWithRows; 

:メインスレッドとで

pthread_create (&threadHandler[threads], NULL, multiplyRows, 
    (void *) doRowOffset); // <<-- Note, removed the '&'. 

+0

ああ、意味があります、私は、値がバッファされていると思ったと思いますが、ポインタを渡してからそれ以外のことを知っていたはずです。ありがとう – csteifel

+0

@legion、はい、実際にパラメータは(スタック上に)バッファされていますが、バッファされていないデータへのポインタなので、それは助けになりません:-) – paxdiablo

+0

私はまだ私のオリジナルを編集しました私が今使っているものを投稿して、配列に変更しました。これは、これらがもう変更されていないことを意味するはずです – csteifel

2

doRowOffsetintある場合は、スレッドが機能仕上げを作成し、それをスタック上に変数を割り当てられ、それが上書きされない限り、あなたは、ごみは表示されません。

しかし、変数が1つしかなく、そのアドレスを渡していることに注意してください。スレッドが開始されると、更新された値が表示されます。

実際の値渡し:

pthread_create(&threadHandler[threads], NULL, multiplyRows, (void *) threads); 

void * multiplyRows(void * dealWithRows){ 
    int offset = (int) dealWithRows); 
} 
関連する問題