为什么cout不适用于pthreads?

时间:2016-08-22 10:04:34

标签: c++ linux pthreads

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

我的代码如下:

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

}

1 个答案:

答案 0 :(得分:-1)

由于std::cout缓冲流,您需要flush才能将缓冲区发送到标准输出。

尝试类似:

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

这应该有效。

附加说明

  1. 正如一些评论已经建议你的那样,std::cout在C ++ 03和之前不是线程安全的 。使用mutex保护该对象可能很有用。 这可能不是问题,因为 C ++ 11 标准。
  2. FDIS在§27.4.1[iostream.objects.overview]中说明以下内容:

      

    同步访问同步(§27.5.3.4)标准iostream对象的格式化和未格式化输入(§27.7.2.1)和输出(§27.7.3.1)函数或多个线程的标准C流不得产生数据种族(§1.10)。 [注意:如果用户希望避免交错字符,则仍必须通过多个线程同步这些对象和流的并发使用。 - 结束说明]

    这意味着没有互斥,可以保证对象不会在数据竞争环境中被破坏。但重叠输出的问题仍然存在。因此,如果您确定每行都是在没有其他线程重叠的情况下打印的,那么您仍需要一个互斥锁。

    1. C ++ 11 引入了一个多线程库(通常是 pthread 的包装器)。 Here some reference。看看,你会发现它很有用。