Я пытаюсь создать рабочую очередь функций, которые должны выполняться одним потоком и могут передаваться многими потоками.Для этого я планировал использовать boost :: packaged_task и boost :: unique_future.Идея состоит в том, что вы должны сделать:
Foo value = queue.add (myFunc) .get ();
, которая будет блокироваться, пока не будет выполнена функция.Таким образом, queue.add (...) принимает boost :: function и возвращает boost :: unique_future.Затем он создает boost :: packaged_task с использованием boost :: function для своего конструктора.
Проблема, с которой я сталкиваюсь, заключается в том, что boost :: function <...> не всегда будет одинаковойвремя.В частности, возвращаемое значение для него изменится (однако функции никогда не будут принимать никаких параметров).Таким образом, у меня должна быть функция добавления, которая выглядит примерно так:
template <typename ResultType>
boost::unique_future<ResultType> add(boost::function<ResultType ()> f) {
boost::packaged_task<boost::function<ResultType ()> > task(f);
queue.push_back(task);
return task.get_future();
}
Ладно, это не так уж и плохо, но потом я столкнулся с проблемой определения «очереди».Я думаю, что у меня нет выбора, кроме как использовать boost :: any, так как типы не будут постоянными:
std::list<boost::any> queue; // note: I'm not concerned with thread-safety yet
Но затем я сталкиваюсь с проблемой, когда пытаюсь реализовать свой executeSingle (занимает всего одинпункт из очереди для выполнения):
void executeSingle() {
boost::any value = queue.back();
boost::packaged_task<?> task = boost::packaged_task<?>(boost::move(value));
// actually execute task
task();
queue.pop_back();
}
'?'обозначить то, в чем я не уверен.Я не могу вызвать executeSingle с шаблоном, так как он вызывается из отдельного потока.Я попытался использовать boost :: any, но я получаю сообщение об ошибке:
conversion from 'boost::any' to non-scalar type boost::detail::thread_move_t<boost:thread>' requested.
Самое смешное, что на самом деле меня не волнует тип возвращаемого значения packaged_task, я просто хочу его выполнить, но я могу разобраться в деталях шаблона.
Любое понимание будет с благодарностью!