我有一个非常重的方法(它检查一个数字是否是素数 - 欧拉3),它阻止了cout
。
这怎么可能?这是我的代码:
int main(int argc, char * argv[]) {
cout << "-----------------------------------------------------------" << endl;
cout << "isPrime(3): " << ((isPrime(3)) ? "true" : "false") << endl;
cout << "isPrime(10): " << (isPrime(10) ? "true" : "false") << endl;
cout << "BLAH";
cout << "BLAH";
cout << "BLAH";
cout << "BLAH";
cout << "BLAH";
cout << "BLAH";
cout << "isPrime(600851475143): " << (isPrime(600851475143.0) ? "true" : "false") << endl; // This one takes very long to complete
cout << "-----------------------------------------------------------";
}
像这样,输出:
[Session started at 2013-01-19 13:50:12 +0100.]
-----------------------------------------------------------
isPrime(3): false
isPrime(10): false
然后停止(几分钟)。 (isPrime()
坏了,我知道!)
如果我用isPrime(600851475143)
注释掉这一行,它会在不到一秒的时间内输出除注释行输出之外的所有内容。
一个非常繁重的方法调用如何阻止应该已经写入cout
的输出?
答案 0 :(得分:5)
cout
写入标准输出,通常是行缓冲的。即缓冲区只有在遇到换行符或endl
时,或者当您明确调用cout.flush()
时才会刷新到控制台。
答案 1 :(得分:1)
如果您使用cout.flush();
或cout << endl;
,则会打印直到刷新点之前待处理的输出。
这是因为cout试图在I / O调用的使用中有效。由于所有代码都在一个线程中运行,因此无法添加超时或其他内容,因此如果您的呼叫需要几分钟,则不会处理输出。
答案 2 :(得分:0)
流缓冲输出,只有在看到换行符时才将其写入控制台。