Условное выполнение потокового графа TBB И несколько входов и выходов

я прочел TBB потоковый граф условного исполнения и есть немного другая проблема.

Можно ли создать узел с несколькими входами и несколькими выходами И для управления выполнением с помощью условной переменной? Может быть, без уродливых бросков.

Я привел простой пример того, как я хотел бы разработать график. Каков наилучший способ запустить его с потоковым графиком TBB?

  1. start_node отправляет start_msg в some_node

  2. если start_msg пустой, some_node отправляет continue_msg в end_nodeиначе some_node отправляет continue_msg к себе и data_msg в end_node

  3. если continue_msg получен some_nodeпредыдущий start_msg проверяется, если он пуст, если это так, continue_msg это отправить end_nodeиначе data_msg это отправить.

                         +--continue_msg--+
    |                |
    +-----+    +-----+
    |    |
    |    |   +----data_msg---+
    v    |  /                 \
    start_node --start_msg--> some_node                    end_node
    \                  /
    +--continue_msg--+
    

Одна проблема, с которой я сталкиваюсь: я не могу сказать, сколько хороших элементов внутри start_msg даже размер известен (скажем, start_msg держит tbb::concurrent_vector<T>, Если some_node находит плохой элемент, он будет игнорироваться и some_node отправляет continue_msg к себе.

0

Решение

Похоже, что source_node может быть использован в вашем алгоритме. source_node может генерировать столько сообщений, сколько вам нужно. Таким образом, алгоритм может быть немного переработан:

source_node -> ... -> end_node

Зачем тебе continue_msg быть отправленным в end_node? Отметить последнее сообщение? Возможно, вы можете использовать std::pair<T,bool> где первый элемент является данными, а второй — указанием последнего сообщения.

Тело source_node находит действительный элемент в tbb::concurrent_vector<T>создает новое сообщение make_pair(Data, false) и возвращается true для каждого вызова Тела. Когда последний элемент извлекается из контейнера, он создает make_pair(Data, true) и возвращается false в качестве указания на последний элемент.

К сожалению, я не знаю оригинальный алгоритм, и мое предложение может быть неуместным. Не могли бы вы предоставить более подробную информацию, если она не соответствует вашим потребностям, пожалуйста?

1

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

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

По вопросам рекламы [email protected]