为什么cout不适用于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);

}
比亚焦·费斯塔(Biagio Festa)

由于std::cout缓冲流,因此需要刷新它才能将缓冲区发送到标准输出。

只需尝试类似:

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

那应该工作。

附加条款

  1. 正如一些评论已经建议您的那样,在C ++ 03及更高版本std::cout不是线程安全的 互斥量保护该对象可能很有用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)。[注意:如果用户希望避免交织字符,则仍必须同步多个线程对这些对象和流的并发使用。—尾注]

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

  1. C ++ 11引入了一个多线程库(通常是pthread的包装器)。这里有一些参考看看,您会发现它很有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的函数适用于矩阵但为什么不适用于向量?

来自分类Dev

为什么忽略SIGTRAP不适用于asm?

来自分类Dev

为什么Map在Groovy中不适用于GString?

来自分类Dev

为什么绑定不适用于动画?

来自分类Dev

为什么python re模块不适用于@?

来自分类Dev

为什么向左滑动不适用于Jquery mobile?

来自分类Dev

为什么这些条件不适用于模板类型?

来自分类Dev

为什么乘法不适用于读取主机值

来自分类Dev

为什么strtok不适用于stringstream?

来自分类Dev

为什么ng-bind不适用于数组?

来自分类Dev

为什么输入模式属性不适用于数字?

来自分类Dev

为什么$别名不适用于此jQuery函数

来自分类Dev

为什么ExtractMpegFramesTest不适用于旋转的输入文件?

来自分类Dev

为什么GCC优化不适用于valarrays?

来自分类Dev

为什么`Condition`属性不适用于`ItemGroup`元素?

来自分类Dev

为什么角度绑定不适用于服务原语

来自分类Dev

为什么CustomStringConvertible协议不适用于Int?

来自分类Dev

为什么此委托不适用于UITextView

来自分类Dev

自动装箱为什么不适用于Short(5)?

来自分类Dev

为什么innerTEXT不适用于节点?

来自分类Dev

为什么CSS覆盖不适用于嵌套按钮?

来自分类Dev

为什么JUnit DataPoints方法不适用于原语?

来自分类Dev

为什么同步方法不适用于多线程

来自分类Dev

为什么“大于”不适用于char类型?

来自分类Dev

为什么bash brace扩展不适用于命令?

来自分类Dev

为什么每个循环不适用于JSON数组

来自分类Dev

为什么加载事件的addEventListener不适用于div?

来自分类Dev

为什么验证不适用于表单请求?

来自分类Dev

为什么更改事件不适用于输入?

Related 相关文章

热门标签

归档