Я пытаюсь сделать программу на С++ для обработки множества пакетов самым быстрым способом. Все пакеты из стандарта должны быть прочитаны как можно быстрее, отправлены в один поток из пула, чтобы выполнить обработку, а затем обработаны выходным потоком, который будет записывать пакет в стандартный вывод.
Когда вы используете стандартный ввод и вывод в С++, он рекомендовал, чтобы перед любым вводом или выводом вы вызывали 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
Итак, где проблема? Разве С++ не способен выполнять многопоточность с использованием быстрого стандартного ввода/вывода?