Есть ли способ опубликовать и синхронизировать задачу независимо от потока звонящего? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть класс, чья активность выполняется с помощью внешнего 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 решит эту проблему, ноКажется, что это не так.Есть идеи, как мне этого добиться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...