首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程编程

多线程编程
EN

Stack Overflow用户
提问于 2012-08-26 18:56:42
回答 4查看 196关注 0票数 0

我写了以下代码:

代码语言:javascript
复制
 #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被相继执行。每次我运行程序时都会发生这种情况。你能告诉我延误的原因吗?

EN

回答 4

Stack Overflow用户

发布于 2012-08-26 21:09:33

我认为

代码语言:javascript
复制
cout <<"next for loop" << endl;

是一种简洁的写作方式。

代码语言:javascript
复制
cout << "next for loop"; 
cout << endl; 

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

代码语言:javascript
复制
cout << "next for loop";
cout << "in func ";
cout << endl;
cout << endl;
...
票数 3
EN

Stack Overflow用户

发布于 2012-08-26 21:11:21

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-26 21:13:43

lockssemaphores没有显式控制执行流的情况下,关于多线程代码的行为没有太多可说的。

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

  1. pthread_create() next for loop
  2. 之后,新创建的线程启动并完整地打印它的句子(in func endl)
    1. The主线程再次运行,并打印剩余的endl

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12129515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档