2016-08-22 73 views
3

我正在尝试一个简单的程序来测试多线程。我只是在备用线程中打印一系列“x”和“O”。现在,如果我使用cout,屏幕上不会显示任何输出。如果我使用fputc并输出到stderr,它可以正常工作。为什么cout(输出到stdout)不在这里工作?下面为什么cout不能与pthreads一起使用?

我的代码给出:

#include <iostream> 
#include <pthread.h> 
#include <unistd.h> 
#include <stdio.h> 

using namespace std; 

static int count; 

void* print_xs(void *unused) 
{ 
    while(1) 
    { 
     if (count >=100) break; 
     if (count%2==0) 
     { 
      count++; 
      cout<<"X="; // no output here 
      fputc('X',stderr); // works ! 
     } 
     else 
     { 
      sleep(1); 
     } 
    } 
    return NULL; 

} 


int main() 
{ 
    pthread_t tid; 
    pthread_create(&tid,NULL,&print_xs, NULL); 

    while(1) 
    { 
     if (count >=100) break; 
     if (count%2!=0) 
     { 
      count++; 
      cout<<"O="; // no output here 
      fputc('O',stderr); // works ! 
     } 
     else 
     { 
      sleep(1); 
     } 
    } 

    pthread_join(tid,NULL); 
    return (0); 

} 
+6

你尝试'冲洗''std :: cout'? – Jarod42

+1

请尝试打印到'stdout'。 –

+2

@Nawaz std :: cout是线程安全的。 – Galik

回答

0

由于std::cout缓冲流,你需要flush它以缓冲发送到标准输出。

刚刚尝试类似:

cout<< "O="; 
cout.flush(); 

这应该工作。

其他注意事项

  1. 正如一些评论已经建议你,std::cout不是线程安全在C++ 03和之前。用mutex保护该对象可能很有用。 这可能不是问题,因为C++ 11标准。

的FDIS说,以下在§27.4.1[iostream.objects.overview]:

并发访问的同步(§27.5.3.4)标准iostream对象的格式和无格式输入(§ 27.7.2.1)和输出(第27.7.3.1节)函数或多线程的标准C流不应导致数据竞争(第1.10节)。 [注意:如果用户希望避免交错字符,用户必须仍然同步使用这些对象和多个线程的流。 - 注完]

这意味着没有互斥它保证的对象将不会在数据争背景下损坏。但是重叠输出的问题依然存在。所以如果你确定每行都被打印出来而没有被另一个线程重叠,你仍然需要一个互斥锁。

  • C++ 11具有引入了多线程库(通常为并行线程的包装)。 Here some reference。只要看看,你会发现它很有用。
  • +0

    谢谢,但我不明白为什么只有在使用线程时这是一个问题?当我正常使用cout时,它在stdout上正确显示。 – vinit

    +0

    这是不正确的。即使在单线程中,你也会得到这种行为。我想你从来没有注意到这一点。我刚刚写了一个简单的代码,它打印了10次字符串(*没有'\ n' *):'for(...)std :: cout <<“something”;'后面跟着一个调试器,直到节目结束。 (您也可以尝试,但取决于特定的实现)。如果你需要,我也可以修改我的答案,并告诉你这种行为。 –

    +0

    @vinit我忘了给你加标签:) –

    相关问题