У меня вопрос по поводу boost::io_service
.
У меня есть набор задач, которые я могу выполнять одновременно. После запуска всех из них мне нужно запустить другой набор задач одновременно. Однако первый набор должен быть завершен до запуска второго набора. Это означает, что мне нужно убедиться, что все задания, отправленные в io_service, выполнены, прежде чем начинать планировать второй набор.
Я могу реализовать это, сохранив какой-то счетчик и добавив цикл занятости, но он не выглядит очень эффективным. Итак, я хотел проверить, есть ли у кого-то лучшая идея или нет. Ниже приведен фиктивный код, который я использовал для экспериментов.
Заранее спасибо!
#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <boost/asio/io_service.hpp>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
const size_t numTasks = 100000;
void print_counter(const size_t id)
{
if (id + 1 == numTasks) {
printf("sleeping for %ld\n", id);
sleep(15);
}
printf("%ld\n", id);
}
int main(int argc, char** argv)
{
using namespace std;
using namespace boost;
asio::io_service io_service;
asio::io_service::work work(io_service);
const size_t numWorker = 4;
boost::thread_group workers;
for(size_t i = 0; i < numWorker; ++i) {
workers.create_thread(boost::bind(&asio::io_service::run, &io_service));
}
for(size_t i = 0; i < numTasks; ++i) {
io_service.post(boost::bind(print_counter, i));
}
// TODO: wait until all the tasks are done above
for(size_t i = 0; i < numTasks; ++i) {
io_service.post(boost::bind(print_counter, i));
}
// TODO: wait until all the tasks are done above
// ...
// Finally stop the service
io_service.stop();
workers.join_all();
return 0;
}