多线程编程

时间:2012-08-26 10:56:42

标签: c++ multithreading pthreads

我写了以下代码:

 #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;
  }

输出结果为: enter image description here 从输出看,似乎在第一次显示'next for loop'之后的endl行改变属性被延迟,并且'next for loop'和'in func'的endl被一个接一个地执行。每次我运行程序时都会发生这种情况。你能告诉我这次延误的原因吗?

4 个答案:

答案 0 :(得分:3)

我认为

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

是一种紧凑的写作方式

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

由于您在多线程环境中工作,因此执行顺序是不可预测的。这就是你的具体情况:

cout << "next for loop";
cout << "in func ";
cout << endl;
cout << endl;
...

答案 1 :(得分:1)

Streams有锁来保护它们,所以它们是单线程的。在运行线程时,您需要自己的某种缓冲区来收集结果。

答案 2 :(得分:0)

对于使用lockssemaphores没有明确控制执行流程的多线程代码的行为,没什么可说的。

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

  1. pthread_create() next for loop句被打印之后
  2. 新创建的主题开始并完全打印其句子(in funcendl
  3. 主线程再次运行并打印剩余的endl
  4. 也可能会发生两个endl以不同的方式重叠(首先是主线程之一,然后是新创建的线程之一)。

    注意:使用std::endl\n\r\n并不是一回事。

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

答案 3 :(得分:0)

正如cout&lt;&lt;某事&lt;&lt; endl是两个单独的指令,并且在多线程环境中cout&lt;&lt; endl很可能在它完成cout&lt;&lt;之后被另一个线程抢占了一些东西。试试这个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;
  }