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

250
17 октября 2017, 03:26

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

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

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

Вопросы:

  1. Может ли мне дать какое-то преимущество этот подход?

  2. И какие сложности могут возникнуть в рамках описанной системы?

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

Answer 1

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

Возможно, для вашей задачи будет удобно использовать в качестве пула потоков boost::asio, поскольку помимо обычных возможностей пула потоков там есть таймеры и асинхронный ввод-вывод (ради чего библиотека и создавалась).

READ ALSO
Как считать массив из файла?

Как считать массив из файла?

Программа должна считывать массив из файла и искать в нём минимальный элемент, но что-то не получается нормально считать сам массивВ чем...

545
Пароль через CreateFile для PhysicalDrive1

Пароль через CreateFile для PhysicalDrive1

Возможно ли через функцию CreateFile установить пароль на PhysicalDrive1, те

229
Вершинное покрытие

Вершинное покрытие

Задача состоит в том, что нужно найти в графе размера N(кол-во вершин) вершинное покрытие размера KАлгоритм работает следующим образом:

328
Qt Перегрузка оператора = для структуры

Qt Перегрузка оператора = для структуры

Не получается перегрузить оператор = для структурыПрограмма компилируется, но при выполнении прямого слияния крашится

232