我正在尝试一个简单的程序来testingmultithreading。 我只是在备用线程中打印一系列“x”和“O”。 现在,如果我使用cout,屏幕上没有看到输出。 如果我使用fputc和输出到标准错误,它工作正常。 为什么cout(输出到标准输出)在这里不工作?
我的代码如下:
#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 ++ 03和之前是不是线程安全的 。 用互斥体保护这个对象可能是有用的。 自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)。 [注意:如果用户希望避免交错字符,用户必须同时使用多个线程同时使用这些对象和流。 – 结束注意]
这意味着没有互斥体就可以保证对象在数据争用上下文中不会被破坏。 但重叠输出的问题依然存在。 所以如果你确定每行都被打印出来而没有被另一个线程重叠,你仍然需要一个互斥锁。