2

私は、1 つのスレッドが多くのシステム コール (読み取り、書き込みなど) を実行し、他のスレッドが printf などの通常の呼び出しを実行するマルチスレッド プログラムを作成しています。スレッド A が通常の呼び出し用で、スレッド B がシステム コール用であると仮定すると、私のメイン関数は次のようになります。

int main()
{
  pthread_t thread_A;
  pthread_t thread_B;

  pthread_create(&thread_B,NULL,&system_call_func,NULL);
  pthread_create(&thread_A,NULL,&printf_func,NULL);

  pthread_join(thread_B,NULL);
  pthread_join(thread_A,NULL);

  printf("Last thread to be executed was %c\n",write_last);
  return 0;
}

これにより、システムコールのあるスレッドは常に最後に実行されることがわかりました。スレッド作成・参加の順番を変えてもスレッドBのままです。 2点質問なのですが、スレッド作成・参加の順番は関係ありますか?スレッド B が常に最後に実行されるのは、システム コールのためですか?

4

1 に答える 1

2

どのスレッドが最初に実行されるかではなく、どのスレッドが最初に終了するかを測定しているだけです。両方が並行して実行され、ほぼ同時に開始すると仮定すると、作業に費やす時間が少ない方が最初に終了します。

両方で操作のシーケンスを観察したい場合は、プログラムを の下で実行しますstrace -f。ただし、トレースのオーバーヘッドによって処理が大幅に遅くなり、システム コールを使用せずに純粋に計算タスクを実行している場合を除いて、トレース対象のプログラムで並列処理が排除される傾向があることに注意してください。 .

于 2013-01-29T03:49:46.750 に答える