gpt4 book ai didi

c++ - 线程库的奇怪行为

转载 作者:搜寻专家 更新时间:2023-10-30 23:56:45 25 4
gpt4 key购买 nike

我不知道这个主题是否与 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 默认是缓冲的。 coutcin 相关联,因此当您开始从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com