gpt4 book ai didi

c++ - C++、cin、cout、threads 和 sync_with_stdio 的损坏输出

转载 作者:可可西里 更新时间:2023-11-01 14:56:57 25 4
gpt4 key购买 nike

我正在尝试用 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++ 不能使用快速标准输入/输出进行多线程处理吗?

最佳答案

我终于找到了罪魁祸首。如果您在 Internet 上搜索,很多网站都建议使用 sync_with_stdio 调用,但他们没有谈论线程。

其他站点谈论 iostream 和线程,例如 this one ,但这并不能解释为什么当我在仅一个线程中使用 std::cin 而在 它自己的线程 中使用 std::cout 时输出被破坏.

问题是在内部,std::cin 输入线程正在调用 std::cout 来刷新它的缓冲区,但是由于流没有与互斥量或类似的东西同步,输出被破坏了。如果它们在做不同的事情,我为什么要同步缓冲区?为什么 std::cin 与 std::cout 混淆?

在 C++ 中,默认情况下,标准流 cin、cerr 和 clog 与 cout 相关联。这是什么意思?这意味着当你尝试从 cin 读取时,首先它会强制刷新到 cout。有时这很有用,因为您可以阅读 here .

但在我的例子中,这导致了一些严重的问题,那么,如何解开流呢?。使用 tie method 非常容易:

std::ios_base::sync_with_stdio(false);

std::cin.tie(nullptr);
std::cerr.tie(nullptr);

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

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

并且因为它避免了每次使用 std::cin 时都进行刷新,所以它也更快 :-)

关于c++ - C++、cin、cout、threads 和 sync_with_stdio 的损坏输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14010147/

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