Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+;的输出损坏+;,cin、cout、线程和与stdio同步 我试图用C++编写一个程序,以最快的方式处理大量的数据包。所有来自标准的数据包都应该尽快读取,从池中发送到一个线程进行处理,然后处理到一个输出线程,该线程将数据包写入标准输出 当你在C++中使用标准输入和输出时,建议在输入或输出之前调用函数。在某些环境中,这可以实现很大的加速,尽管您应该避免在调用后使用标准C函数进行输入/输出_C++_Multithreading_Input_Corruption_Output - Fatal编程技术网

C+;的输出损坏+;,cin、cout、线程和与stdio同步 我试图用C++编写一个程序,以最快的方式处理大量的数据包。所有来自标准的数据包都应该尽快读取,从池中发送到一个线程进行处理,然后处理到一个输出线程,该线程将数据包写入标准输出 当你在C++中使用标准输入和输出时,建议在输入或输出之前调用函数。在某些环境中,这可以实现很大的加速,尽管您应该避免在调用后使用标准C函数进行输入/输出

C+;的输出损坏+;,cin、cout、线程和与stdio同步 我试图用C++编写一个程序,以最快的方式处理大量的数据包。所有来自标准的数据包都应该尽快读取,从池中发送到一个线程进行处理,然后处理到一个输出线程,该线程将数据包写入标准输出 当你在C++中使用标准输入和输出时,建议在输入或输出之前调用函数。在某些环境中,这可以实现很大的加速,尽管您应该避免在调用后使用标准C函数进行输入/输出,c++,multithreading,input,corruption,output,C++,Multithreading,Input,Corruption,Output,好吧,这似乎在一个线程中完美地工作。但正如我所说,我的意图是使用一个线程进行输入,一个线程进行输出,多个线程进行并行处理。我观察到输出有一些问题。这是输出线程(非常简化): 那么,问题在哪里?C++不是用快速标准输入/输出来完成多线程吗? 我终于找到了罪魁祸首。如果你在互联网上搜索,很多网站都建议使用sync_with stdio调用,但他们没有提到线程 其他网站谈论iostreams和线程,比如,但这并不能解释为什么我在中使用std::cin时只有一个线程,而std::cout也在它自己的线程

好吧,这似乎在一个线程中完美地工作。但正如我所说,我的意图是使用一个线程进行输入,一个线程进行输出,多个线程进行并行处理。我观察到输出有一些问题。这是输出线程(非常简化):


那么,问题在哪里?C++不是用快速标准输入/输出来完成多线程吗?

我终于找到了罪魁祸首。如果你在互联网上搜索,很多网站都建议使用sync_with stdio调用,但他们没有提到线程

其他网站谈论iostreams和线程,比如,但这并不能解释为什么我在中使用std::cin时只有一个线程,而std::cout也在它自己的线程中使用时输出被破坏

问题是,在内部,std::cin输入线程调用std::cout来刷新其缓冲区,但由于没有与互斥或类似对象同步的流,输出被破坏。如果缓冲区正在执行不同的操作,为什么要同步它们?为什么性病::cin会和性病::cout发生冲突

在C++中,默认情况下,标准流CIN、CERP和CULG与CUT绑定。这是什么意思?这意味着,当你试图从cin读取数据时,首先它会强制刷新cout。有时,这是一些有用的东西,你可以阅读

但在我的例子中,这导致了一些严重的问题,那么,如何解开这些流呢?。使用以下工具非常简单:

或者,如果您的编译器不支持C++11:

std::ios_base::sync_with_stdio(false);

std::cin.tie(static_cast<ostream*>(0));
std::cerr.tie(static_cast<ostream*>(0));

由于它避免了每次使用std::cin时进行冲洗,因此速度也更快:-)

很好。所以stdout的出现是因为很多人都这样做:
cout>name,并且在没有输出时会混淆。有些C库没有“阅读前刷新”,这至少会让初学者感到困惑。顺便说一句,你不需要显式转换
static\u转换(0)。您只需通过
0
as
std::cin.tie(0)
,您还应该保存返回的流,这样当您完成时,您就可以
将它绑定到流。纳瓦兹,您是对的。我试图使所有的类型都安全,但在这种情况下,演员是没有必要的。虽然我的程序中不需要它,但保存返回的指针是一个很好的建议。
Packet id = Packet id = 4
Packet id = 5
Packet id = 6
Packet id = 7
Packet id = 8
Packet id = 9
Packet id = 10
std::ios_base::sync_with_stdio(false);

std::cin.tie(nullptr);
std::cerr.tie(nullptr);
std::ios_base::sync_with_stdio(false);

std::cin.tie(static_cast<ostream*>(0));
std::cerr.tie(static_cast<ostream*>(0));
Packet id = 1
Packet id = 2
Packet id = 3
Packet id = 4
Packet id = 5
Packet id = 6
Packet id = 7
Packet id = 8
Packet id = 9
Packet id = 10