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

关于多线程代码的行为没有太多可说的,其中没有使用locks和对执行流程进行显式控制semaphores

例如,在您发布的代码中,可能会发生以下情况:

  1. 就在pthread_create()句子next for loop被打印之后
  2. 新创建的线程开始并完全打印它的句子(in funcendl
  3. 主线程再次运行并打印剩余的endl

也可能发生这两个endl以不同的方式重叠(首先是主线程的一个,然后是新创建的线程的一个)。

注意:使用std::endland \nor\r\n不是一回事。

std::endl还包括一个输出缓冲区刷新操作。

于 2012-08-26T13:13:43.320 回答
0

正如上面的一些答案所指出的那样 cout << something << endl 是两条独立的指令,在多线程环境中 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 回答