作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我不知道这个主题是否与 std::thread 库或流有关。看看下面的例子:
#include <thread>
#include <iostream>
void read(){
int bar;
std::cout << "Enter an int: ";
std::cin >> bar;
}
void print(){
std::cout << "foo";
}
int main(){
std::thread rT(read);
std::thread pT(print);
rT.join();
pT.join();
return 0;
}
我不关心它是否会在执行 read() 函数之前或之后打印“foo”字符串。令我困扰的是,当它在执行 print() 函数之前要求输入时,它实际上挂起了执行。我必须单击“输入”或向 std::cin 提供一些数据才能看到“foo”字符串。您可以在下面看到该程序如何运行的三种可能情况:
1.
>> Enter an int: //here I've clicked enter
>> foo
>> 12 //here I've written "12" and clicked enter
//end of execution
2.
>> fooEnter an int: 12 //here I've written "12" and clicked enter
//end of execution
3.
>> Enter an int: 12 //here I've written "12" and clicked enter
>> foo
//end of execution
如您所见,有时我必须单击回车才能看到“foo”字符串。在我看来,它应该每次都打印出来,因为它是在一个单独的线程中启动的。也许 std::cin 以某种方式阻止了 std::cout?如果是,我该怎么办?
最佳答案
这是完全正常的,输出到 std::cout
默认是缓冲的。 cout
与 cin
相关联,因此当您开始从 cin
读取或按回车时,cout
缓冲区会被刷新并出现在屏幕上。
可能发生的情况是第一个线程写入它的输出,它被缓冲,然后它等待输入,这刷新输出缓冲区(所以你看到 “Enter an int:”
)然后第二个线程写入其输出,但它位于缓冲区中,直到读取输入,此时输出再次刷新。
您可以通过手动刷新其缓冲区来强制第二个线程立即输出:
std::cout << "foo" << std::flush;
这可能会导致 "fooEnter an int:"
或 "Enter an int:foo"
但您不需要在 之前按 Enter foo"
出现。
关于c++ - 线程库的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27187970/
我是一名优秀的程序员,十分优秀!