void Node::recursiveThing()
{
for(auto iter = m_children.begin();
iter != m_children.end();
iter++)
{
s_threadPool->addTask(std::bind(&Node::recursiveThing, (*iter));
}
}
int main()
{
Node * hugeThree = makeHugeTreeMethod();
std::future allIterationsDone = s_threadPool->addTask(std::bind(&Node::recursiveThing, hugeTree));
allIterationsDone.wait(); // I want to somehow block here until all spawned child tasks are done.
}
Да.Многопоточная рекурсивная синхронизация задач
Таким образом, моя проблема заключается в том, что я хотел бы создавать дочерние задачи из задачи, что, в свою очередь, порождает еще больше дочерних задач. Это работает, но как я могу узнать, что все порожденные дочерние задачи завершены? Может быть, мне нужно создать безопасный список, где они все добавлены?
Я где-то читал, что это возможно в C++ 17, но мне нужно что-то сейчас, любые идеи?
А как насчет вектора фьючерсов? Возможно, вы можете перебрать этот вектор, вызывающий 'get()' для каждого элемента. – Galik
Я бы просто использовал счетчик. Увеличивайте его каждый раз, когда вы добавляете задание этого типа и уменьшаете его каждый раз, когда вы завершаете. –
@Galik Но, гм, я не знаю всех фьючерсов, когда делаю основную задачу. Когда будущее будет завершено, оно может вернуть больше фьючерсов и так далее. Но как мне это написать? std :: future >>>>> и так далее .. –
0xbaadf00d