1

最初に関数をお見せしましょう:

for (i=0; i<3;i=i+2){
 pthread_create(&thread1, NULL, &randtrack, (void *)&rnum_array[i]);
 pthread_create(&thread2, NULL, &randtrack, (void *)&rnum_array[i+1]);
 pthread_join(thread1, NULL);
 pthread_join(thread2, NULL);
} 

print final result here;

私の理解では、2 つのスレッドが作成された後、親スレッドは join(thread1) でブロックされます。実際にスレッド 2 がスレッド 1 よりも早く戻ってくるのは何ですか? より長いスレッドを常に後ろに残すにはどうすればよいですか?

ありがとう

4

1 に答える 1

1

thread2終了してまだ終了していない場合thread1は、終了するまで待機し続けますthread1thread2その後、ほぼ瞬時に完了する終了まで待ちます。スレッドを待機する順序は重要ではありません (スレッドが相互に呼び出しpthread_killたり、相互に直接対話しようとしない限りpthread_join)。

更新:あなたのデザインは、実際にやろうとしていることに対して完全に間違っています。あなたはこれをしたい:

  1. 実行する必要がある作業を追跡するための構造を作成します。ミューテックスで保護し、現在動作しているスレッドの数と、次に割り当てる必要がある作業単位を追跡する必要があります。

  2. スレッドを作成するときは、mutex を取得し、次の作業単位を取得し、実行中のスレッドの数を増やしてから作業を行う関数を実行させます。

  3. スレッドが作業単位を完了すると、mutex を取得し、実行中のスレッドの数を減らして、他にやるべき作業があるかどうかを確認する必要があります。実行する作業がない場合、スレッドは終了する必要があります。

  4. すべてのスレッドが終了するのを待つことができるようになりました。これは、すべての作業が完了したときにのみ発生します。これにより、作業単位のループがなくなります。

そして、非常に重要な一般規則を学んでください。スレッドは、仕事を成し遂げるためのものです。コードで焦点を当てたいのは、作業がどのように行われるかではなく、作業を行うことです。スレッドが完了するのではなく、作業が完了するのを待つようにしてください。

于 2012-11-18T05:40:41.970 に答える