Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Стоит ли заменить подход std:thread на std::async?

#cpp #многопоточность #async #многоагентная_система


В проекте (многоагентная система для работы с потоком разнотиповых данных в реальном
времени) используется многопоточность из стандартной библиотеки C++, а именно подход
на основе потоков std::thread.

Функционал каждого агента исполняется в отдельном потоке. Учитывая соотношение между
количеством агентов и характеристиками железа, на котором работает эта система - такое
разделение (на потоки) имеет логический характер, а не производительный (это будет
решаться позже).

Прочитал недавно про подход на основе задач std::async.

Вопросы:


Может ли мне дать какое-то преимущество этот подход?
И какие сложности могут возникнуть в рамках описанной системы?
Где прочитать про эту технологию? Я смотрел только пару обзорных статей.

    


Ответы

Ответ 1



Эффективность std::async сильно зависит от реализации. В старых версиях gcc, например, std::async вообще всегда работает в том же потоке, где вызывается future.get(), несмотря на флаг launch_async. Но даже если реализация хорошая, в лучшем случае std::async будет отправлять задачу в обычный пул потоков. В этом случае проще взять сразу готовый пул потоков и работать с ним, тем более есть пулы потоков с поддержкой std::future, что делает их интерфейс похожим на std::async. Одна из реализаций есть тут. Возможно, для вашей задачи будет удобно использовать в качестве пула потоков boost::asio, поскольку помимо обычных возможностей пула потоков там есть таймеры и асинхронный ввод-вывод (ради чего библиотека и создавалась).

Комментариев нет:

Отправить комментарий