我写了以下代码:
#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被相继执行。每次我运行程序时都会发生这种情况。你能告诉我延误的原因吗?
发布于 2012-08-26 21:09:33
我认为
cout <<"next for loop" << endl;是一种简洁的写作方式。
cout << "next for loop";
cout << endl; 由于您是在多线程环境中工作,因此执行顺序是不可预测的。这就是在你的特殊情况下发生的事情:
cout << "next for loop";
cout << "in func ";
cout << endl;
cout << endl;
...发布于 2012-08-26 21:11:21
Streams有锁来保护它们,所以它们是单线程的。在运行线程时,您将需要自己的某种缓冲区来收集结果。
发布于 2012-08-26 21:13:43
在locks和semaphores没有显式控制执行流的情况下,关于多线程代码的行为没有太多可说的。
例如,在您发布的代码中,可能会发生以下情况:
pthread_create() next for loop in func endl)endl也可能发生两个endl以不同的方式重叠(首先是主线程的一个,然后是新创建的线程的一个)。
注意:使用std::endl和\n或\r\n不是一回事。
std::endl还包括输出缓冲区刷新操作。
https://stackoverflow.com/questions/12129515
复制相似问题