1

可能重复:
为什么我的 cout 输出没有立即出现?

我有一个非常繁重的方法(它检查一个数字是否是素数 - Euler 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)out 注释该行,它当然会在不到一秒的时间内输出除注释行的输出之外的所有内容。

一个非常繁重的方法调用怎么可能阻塞应该已经写入的输出cout

4

3 回答 3

5

cout写入标准输出,通常是行缓冲的。即缓冲区仅在遇到换行符或 时才会刷新到控制台endl,或者当您显式调用cout.flush().

于 2013-01-19T13:02:02.383 回答
1

如果使用cout.flush();or cout << endl;,将打印直到刷新点的输出。

这是因为 cout 试图有效地使用 I/O 调用。由于所有代码都在一个线程中运行,因此无法添加超时或其他东西,因此如果您的调用需要花费几分钟,则不会处理输出。

于 2013-01-19T13:03:17.690 回答
0

流缓冲输出,并且仅在看到换行符时才将其写入控制台。

于 2013-01-19T13:02:43.313 回答