2016-03-21 21 views
0

sleep()のような迂回路を使わずに他の命令に移る前にスレッドが作成されたことを確認する方法はありますか?スレッドの作成を待つ

私はこのようになりますループを持っている:baseは、配列へのポインタです

for(i = 0; i < NUM_THREADS; ++i) 
{ 
    if(pthread_create(&threads_id_array[i], NULL, ThreadFunction, &args)) 
    { 
     perror("pthread_create() error"); 
     exit(1); 
    } 
    args.base += args.offset; 
} 

。スレッドのargs.baseが正しい値を保持していることを確認できるように、スレッドがbaseのプロモーションの前に作成されていることを確認します。現在、これによりバグが発生しています。

+0

スレッドによって 'args.base'が設定されていますか?スレッドが作成されていて、値を設定する時点まで実行されていることに違いがあるためです。 –

+1

'pthread_create()'が0を返すと、スレッドは「作成されました」。しかし、それが実行を開始したのか、スケジュールされるのを待っているのかは別です。 'args.base'が作成されたか、何かを実行した場合にのみ更新されるようにしますか? 'args.base'がスレッドセーフな方法でアクセスされているようです(おそらくデータレース)。 [MCVE]を投稿してください。 –

+0

@ColonelThirtyTwo、 'args.base'はメインスレッドによって設定され、作成されるスレッドでは設定されません。 – HeyJude

答えて

0

CPUの作業をスピードアップするためには、pthreadsではなくOpenMPを検討してください。このよう

:@Soonts答えと@Martinジェームズコメントに加えて

#pragma omp parallel for 
for(i = 0; i < NUM_THREADS; i++) 
{ 
    auto threadArgs = args; 
    threadArgs.base += i * threadArgs.offset; 
    ThreadFunction(&threadArgs); 
} 
0

は、ここでは別のオプションの抜粋だ - つまり、構造体の配列を使用して、各スレッドにそれぞれのインデックスを送信:

char *base_ptr = base; 
args_t args_array[NUM_THREADS]; 

for(i = 0; i < NUM_THREADS; ++i) 
{ 
    args_array[i].base = base_ptr; 
    base_ptr += args_array[i].offset; 
} 

for(i = 0; i < NUM_THREADS; ++i) 
{ 
    if(pthread_create(&threads_id_array[i], NULL, ThreadFunction, &args_array[i])) 
    { 
     perror("pthread_create() error"); 
     exit(1); 
    } 
} 
関連する問題