У меня есть класс, чья активность выполняется с помощью внешнего boost :: asio :: io_context, и я хочу написать метод, который выполняется io_context и для которого вызывающий может быть синхронизирован.Следующий пример демонстрирует мою проблему:
class MyClass
{
public:
MyClass(boost::asio::io_context &ioc) : ioc_(ioc) {}
void f() {
std::promise<void> promise;
auto my_task = [&]{
std::cout << "execution of my_task" << std::endl;
promise.set_value();
};
boost::asio::dispatch(ioc, my_task);
promise.get_future().get();
std::cout << "f() is complete" << std::endl;
}
private:
boost::asio::io_context& ioc_;
};
boost::asio::io_context ioc;
MyClass my_class{ioc};
std::thread thread{ []{ ioc.run(); } };
my_class.f(); // different threads
ioc.post([&]{ my_class.f(); }); // same thread
Я бы хотел, чтобы MyClass :: f () выполнялся независимо от контекста, чтобы вызывающая сторона могла запускаться или не работать в том же потоке, что и my_task * 1004.*
Когда f () вызывается потоком, отличным от потока, в котором запущен io_context, my_task публикуется и все работает нормально.
Когда f () вызывается другой задачей, выполняющейся в io_context, my_task наиболеевремени, выполненного напрямую, и все в порядке, но в некоторых случаях my_task действительно публикуется и приводит к тупику.
Я действительно думал, что boost :: asio :: dispatch решит эту проблему, ноКажется, что это не так.Есть идеи, как мне этого добиться?