Страницы

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

понедельник, 4 марта 2019 г.

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

В проекте (многоагентная система для работы с потоком разнотиповых данных в реальном времени) используется многопоточность из стандартной библиотеки C++, а именно подход на основе потоков std::thread
Функционал каждого агента исполняется в отдельном потоке. Учитывая соотношение между количеством агентов и характеристиками железа, на котором работает эта система - такое разделение (на потоки) имеет логический характер, а не производительный (это будет решаться позже).
Прочитал недавно про подход на основе задач std::async
Вопросы:
Может ли мне дать какое-то преимущество этот подход? И какие сложности могут возникнуть в рамках описанной системы? Где прочитать про эту технологию? Я смотрел только пару обзорных статей.


Ответ

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

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

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