我正在尝试一个简单的程序来测试多线程。我只是在备用线程中打印了一系列的“ 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);
}
由于std::cout
是缓冲流,因此需要刷新它才能将缓冲区发送到标准输出。
只需尝试类似:
cout<< "O=";
cout.flush();
那应该工作。
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)。[注意:如果用户希望避免交织字符,则仍必须同步多个线程对这些对象和流的并发使用。—尾注]
这意味着,如果没有互斥锁,则可以确保对象在数据争用上下文中不会损坏。但是输出重叠的问题仍然存在。因此,如果您确定每一行的打印都没有其他线程重叠,那么您仍然需要一个互斥锁。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句