Конвейерный поток данных с использованием асинхронных функций C ++ 11

Я пытаюсь реализовать многопоточный конвейер потока данных со следующими функциями:

  1. Конвейер может быть описан как ациклический ориентированный граф. Каждый узел выполняет некоторую обработку и имеет произвольное количество входов произвольных типов и один выход произвольного типа.

  2. Для каждого данного экземпляра входных данных каждый узел должен быть выполнен не более одного раза, после чего результат должен быть кэширован. Хотя этот кеш не должен сохраняться в памяти дольше, чем требуется, и его следует удалять, когда он больше не нужен другим узлам.

  3. Каждый узел должен поддерживать отложенную оценку, т. Е. Должен выполняться только в тот момент, когда его вывод необходим другому узлу.

Можно ли реализовать это с помощью функций многопоточности C ++ 11, особенно std::future, std::promise а также std::async? Кто-нибудь может дать подсказку?

0

Решение

Я считаю, что на самом деле это довольно тривиально, используя async фреймворк.

Если вы посмотрите на станд :: запуск вы поймете, что есть отложенный режим:

  • std::launch::deferred: задача выполняется в вызывающем потоке при первом запросе ее результата (ленивая оценка)

Таким образом, вы можете запустить задачу и выполнить ее только тогда, когда нужен результат. Однако, поскольку вы упоминаете ациклический граф, вы, вероятно, хотите поделиться результатом: std::future (в ответ на звонок std::async) нельзя делиться; тебе необходимо std::shared_future за это.

И, таким образом, в целом:

// Disclaimer:
// Compiles but does not run, but I have not figured it out.
// See: http://ideone.com/XZ49Dg

#include <future>
#include <iostream>

int main() {
std::shared_future<std::string> greeting = std::async(std::launch::deferred, []() {
std::string s;
std::cout << "Enter how you would like to be greeted: ";
std::getline(std::cin, s);
return s;
});

std::shared_future<int> choice = std::async(std::launch::deferred, []() {
int c = 0;
std::cout << "Pick any integer: ";
std::cin >> c;
return c;
});

std::shared_future<void> complete = std::async(std::launch::deferred, [=]() mutable {
std::string const g = greeting.get();
int const c = choice.get();

std::cout << "Hello " << g << ", you picked " << c << "!\n";
});

complete.wait();
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector