小编imr*_*era的帖子

使用C++,cin,cout,threads和sync_with_stdio损坏输出

我试图用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();
}
Run Code Online (Sandbox Code Playgroud)

如果我使用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 …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading input corruption output

11
推荐指数
1
解决办法
3495
查看次数

标签 统计

c++ ×1

corruption ×1

input ×1

multithreading ×1

output ×1