2015-05-18 2 views
0

Я сбрасывая несколько асинхронные задачи, как так:Подождите несколько асинхронных задач для завершения

for(UINT Id: myIds) 
{ 
    std::async([=] 
    { 
     DoSomeStuffUsingId(Id);    

     return true; 
    }); 
} 

У меня есть функция, которая должна знать, если все эти задачи выполнили:

void SomeFunction() 
{ 
    if (all async tasks have completed) 
    { 
     do something else 
    } 
} 

I понимаю, что я могу ждать на задачу асинхронном так:

std::future<bool> fut = std::async (do something); 
fut.wait(); 

И я вижу из этой ссылке Waiting for multiple futures? т шляпа еще не ждет нескольких фьючерсов.

Есть ли какой-либо трюк, который я могу использовать, чтобы проверить, завершены ли все мои задачи?

Могу ли я хранить каждое будущее в массиве или векторе и ждать по очереди?

+0

Одна вещь, которую вы могли бы сделать, - это связать каждую ссылку на поток атомарным bool. Когда задача будет завершена, она может установить значение true. Тогда вы знаете, что эта нить завершена. Это позволяет вам опросить переменную без команды wait. – NathanOliver

+0

Вы пытались хранить каждое будущее в массиве или векторе и ожидали каждого? Звучит как совершенно разумный образец для использования. – huu

+0

Обратите внимание, что просто вызов std :: async() недостаточен, чтобы гарантировать, что все лямбды выполняются как асинхронные задачи, вам нужно указать std :: launch :: async, чтобы убедиться в этом. См. Http://en.cppreference.com/w/cpp/thread/async –

ответ

0

Вы можете использовать std :: shared_future (который может быть скопирован) или вектор :: emplace_back(), чтобы заменить std :: futures ', который нельзя скопировать, но его можно переместить.