0

次のコードを書きました。

 #include<iostream>
 #include<pthread.h>
 using namespace std;

 void* func(void *i)
 {
  cout<<"in func "<<endl;
 }

 int main()
 {
  pthread_t threads[5];

  for(int i=0;i<5;i++)
  {
  pthread_create(&threads[i], NULL, func, (void*)i);
  cout<<"next for loop"<<endl;
  }

  pthread_exit(NULL);
  return 0;
  }

出力結果は次 のとおりです。 出力ここに画像の説明を入力 から、「next for loop」の最初の表示後にプロパティを変更する endl 行が遅延し、「next for loop」と「in func」の endl が次々に実行されるようです。これは、プログラムを実行するたびに発生しました。この遅れの理由を教えていただけますか?

4

4 に答える 4

3

と思います

cout <<"next for loop" << endl;

コンパクトな書き方です

cout << "next for loop"; 
cout << endl; 

マルチスレッド環境で作業しているため、実行順序は予測できません。それがあなたの特定のケースで起こったことです:

cout << "next for loop";
cout << "in func ";
cout << endl;
cout << endl;
...
于 2012-08-26T13:09:32.760 に答える
1

ストリームにはそれらを保護するためのロックがあるため、シングルスレッドです。スレッドの実行中に結果を収集するには、独自のバッファーが必要です。

于 2012-08-26T13:11:21.483 に答える
0

上記のいくつかの回答で指摘されているように、 cout << something << endl は2つの別々の命令であり、マルチスレッド環境では cout << endl は、 cout << something を実行した直後に別のスレッドによってプリエンプトされる可能性が非常に高い. このCスタイルの改行文字(エスケープシーケンス)を試してください:

#include<iostream>
#include<pthread.h>
 using namespace std;

 void* func(void *i)
 {
  cout<<"in func \n";
  //cout << "\n";
  //cout<<endl;
 }

 int main()
 {
  pthread_t threads[5];

  for(int i=0;i<5;i++)
  {
  pthread_create(&threads[i], NULL, func, (void*)i);
  cout<<"next for loop\n";
  //cout << "\n";
  //cout<<endl;
  }

  pthread_exit(NULL);
  return 0;
  }
于 2012-08-27T11:06:15.327 に答える
0

locksおよびを使用して実行フローを明示的に制御しないマルチスレッド コードの動作については、あまり説明する必要はありませんsemaphores

たとえば、投稿したコードでは、次のことが発生する可能性があります。

  1. 文が印刷されpthread_create()た直後next for loop
  2. 新しく作成されたスレッドが開始され、その文全体が出力されます ( in funcand endl)
  3. メインスレッドが再度実行され、残りのスレッドが出力されますendl

また、2 つのスレッドが別の方法でオーバーリープすることもありendlます (最初にメイン スレッドの 1 つ、次に新しく作成されたスレッドの 1 つ)。

注: std::endland \norの使用\r\nは同じではありません。

std::endl出力バッファのフラッシュ操作も含まれます。

于 2012-08-26T13:13:43.320 に答える