Вот моя проблема, скажем, у меня есть кусок кода синхронизации, который должен выполняться синхронно, и у меня есть пул потоков для этого.Я могу предоставить выноску для этой «задачи», которая может установить значение для обещания повышения.
Теперь я жду, пока один поток диспетчера запустится как io_service, этот сервис получит «запрос» через io.post, выберет рабочий поток из пула, отправит ему задание и передаст «выноску»(это будет работать на рабочем потоке и "делать" обещание. set_value ". То, что я хочу сделать, это какое-то" продолжение ", которое будет выполняться на" io_service ". Один из способов, которым я могу это сделать, - это" вызов "представит «новое задание» на io_service, это задание может быть лямбда, переданным из «инициатора запроса», следовательно, не используя «обещание» и «будущее». Вопрос в том, могу ли я как-то использовать «будущее» для этого?заставить "promise.set_value" передать это "продолжение".
Я попробовал следующий код, как предложено ниже:
void worker(promise<int>& p) {
sleep(10);
p.set_value(10);
}
int main(int argc, char **argv) {
io_service io;
io_service::work work(io);
promise<int> p;
io.post([&] {
std::cout << "submission id:" << boost::this_thread::get_id() << std::endl;
boost::thread my_thread(&worker, boost::ref(p));
p.get_future().then(launch::async, [](future<int> p){
std::cout << "completion thread id:" << boost::this_thread::get_id() << std::endl;
});
});
io.run();
}
вот вывод: идентификатор задания: 7f0c7b825b80 идентификатор завершения задания: 7f0c798be700
Кажется, что он выполняет завершение в другом потоке, и мне нужно, чтобы он вызывался на "io_service" one ... Должен ли я просто "опубликовать" из стороннего потока новый "JOB"?
Я используюхотя повышение 1.65.