2016-05-05 7 views
0

私のC++アプリケーションでpthreadsに問題があります。Pthread_create()の開始ルーチンパラメータが正しくありません。

int main(){ 
    ... 

    for(i=0; i<numberOfThreads; i++){ 
     arg[0]=i; 
     pthread_create(&tidVec[i], NULL, &thread_body, (void*) arg); 
     cout << "tidVec[" << i <<"]: " << tidVec[i] << " arg[0]: " << arg[0] << endl; 
    } 

    ... 
} 

そして、私のthread_body機能で:私は私の主な機能には

これに

void * thread_body(void* arg){ 
    ... 
    int* a = (int*)arg; 
    cout << "tid: " << pthread_self() << " no.thread: " << a[0] << endl; 

    ... 
} 

出力(例えば= 2 numberOfThreadsとは)ように見える:

tidVec [0]:2932403008 arg [0]:0

tidVec [1]:2924010304の​​arg [0]:1

TID:2924010304 no.thread:1

TID:2932403008 no.thread:より一般的な場合には1

とnumberOfThreads = n、no.threadはすべてのスレッドに対してn-1に等しい。 私は理由を理解するのを助けてくれますか?スタートルーチンをどのように使用するのか分からないことがありますか?

ありがとうございます。あなたがここにすべてのスレッドに同じ場所(arg[0])のアドレスを渡すので、

+1

pthreadsの代わりにC++ 11と[std :: thread](http://en.cppreference.com/w/cpp/thread/thread)を使用することを検討してください。 –

答えて

1

コード内でdata raceをあります:

arg[0]=i; 
    pthread_create(&tidVec[i], NULL, &thread_body, (void*) arg); 

あなたは、おそらく使用することを意味:代わりに

arg[i]=i; 

。また、ループで行うプリントにも同じことが適用されます。

+0

argは、スレッドに必要な情報を格納するために使用する長さ2のint *です。 arg [1]はすべてのスレッドの固定値ですが、arg [1]はスレッドの "number"を格納します。 10.各反復で、argの最初の要素を変更してから、配列をpthread_create()に渡します。それは間違っていますか? – user2440822

+0

@ user2440822はい、それはデータ競争につながるので間違っています。あなたはスレッドがどのような順序でスケジュールされているか分からない。たとえば、arg1を1に設定してから* thread1がそれを読み取る前に、main関数が2に変更する可能性があります。 –

+0

これでエラーが発生しました。すべてのスレッドに共通の値のグローバル変数を返し、開始ルーチンに引数としてiを渡すだけです。私の間違いは、pthread_createの直後でarg [0]を変更する前にルーチンが開始されたということでした。大いに感謝する! – user2440822

関連する問題