我正在尝试用 C++ 编写一个程序,以尽可能快的方式处理大量数据包。所有来自标准的数据包都应该被尽可能快地读取,从池中发送到一个线程进行处理,然后处理到将数据包写入标准输出的输出线程。
当您在 C++ 中使用标准输入和输出时,建议在任何输入或输出之前调用std::ios_base::sync_with_stdio(false)函数。在某些环境中,这实现了很大的加速,尽管您应该避免在调用后使用标准 C 函数进行输入/输出。
好吧,这似乎在单个线程中完美运行。但正如我所说,我的意图是使用一个线程进行输入,一个线程用于输出,多个线程进行并行处理。我观察到输出存在一些问题。这是输出线程(非常简化):
void PacketDispatcher::thread_process_output(OutputQueue& output_queue) {
std::vector<Packet> packet_list;
while(output_queue.get(packet_list)) {
for (const auto& packet: packet_list) {
std::cout << "Packet id = " << packet.id << "\n";
}
}
std::cout.flush();
}
如果我使用std::endl而不是"\n"则损坏较少,但 std::endl 会强制刷新流,在这种情况下会影响性能(问题没有解决,只是最小化了)。
这是程序中使用 std::cout 的唯一一点,但是如果我在程序开始时调用std::ios_base::sync_with_stdio(false),我会得到明显的加速,但我的输出总是在某些情况下被破坏方法:
Packet id = Packet id = 4
Packet id = 5
Packet id = 6
Packet id = 7
Packet id = 8
Packet id = 9
Packet id = 10
那么,问题出在哪里?C++ 不能使用快速标准输入/输出进行多线程吗?