我写了以下代码:
#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被一个接一个地执行。每次我运行程序时都会发生这种情况。你能告诉我这次延误的原因吗?
答案 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)
对于使用locks
和semaphores
没有明确控制执行流程的多线程代码的行为,没什么可说的。
例如,在您发布的代码中,可能会发生以下情况:
pthread_create()
next for loop
句被打印之后in func
和endl
)endl
也可能会发生两个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;
}