я прочел TBB потоковый граф условного исполнения и есть немного другая проблема.
Можно ли создать узел с несколькими входами и несколькими выходами И для управления выполнением с помощью условной переменной? Может быть, без уродливых бросков.
Я привел простой пример того, как я хотел бы разработать график. Каков наилучший способ запустить его с потоковым графиком TBB?
start_node
отправляет start_msg
в some_node
если start_msg
пустой, some_node
отправляет continue_msg
в end_node
иначе some_node
отправляет continue_msg
к себе и data_msg
в end_node
если 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
к себе.
Похоже, что 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
в качестве указания на последний элемент.
К сожалению, я не знаю оригинальный алгоритм, и мое предложение может быть неуместным. Не могли бы вы предоставить более подробную информацию, если она не соответствует вашим потребностям, пожалуйста?
Других решений пока нет …