намотанная нить boost :: asio не работает сразу - PullRequest
0 голосов
/ 23 января 2019

Я недавно использовал boost::asio::strand. Я неопытен в этом.

С чем я столкнулся, если я сделаю вызов function1 с strand::wrap() и вызову function2 с strand::wrap() в ~function1, function2 ожидает завершения function1.

ioservice->post(m_strand.wrap(boost::bind( function1 )));
    ioservice->post(m_strand.wrap(boost::bind( function2 )));  

если я изменяю, меняю код следующим образом, он работает, как я ожидал

ioservice->post(m_strand.wrap(boost::bind( function1 )));
    ioservice->post((boost::bind( function2 )));

Это потому, что m_strand ставит в очередь вызовы функций?

Что я нашел в своем поиске;

boost :: asio :: strand гарантирует, что для тех обработчиков, которые отправляются через него, исполняющему обработчику будет разрешено завершить до запуска следующего. Это гарантируется независимо от количества потоков, которые вызывают io_service :: run (). Конечно, обработчики могут по-прежнему выполняться одновременно с другими обработчиками, которые не были отправлены через boost :: asio :: strand или были отправлены через другой boost :: asio :: strandobject.

При инициировании асинхронных операций каждый обработчик обратного вызова обернутый с использованием объекта boost :: asio :: strand. Strand :: wrap () функция возвращает новый обработчик, который автоматически отправляет его содержит обработчик через объект boost :: asio :: strand. Оборачивая обработчики, использующие один и тот же boost :: asio :: strand, мы гарантируем, что они не могут выполняться одновременно.

Что я должен сделать для выполнения function2, не дожидаясь завершения function1? (Я знаю, что могу выполнить его без потока или нити, но я хочу вызвать его с помощью strand::wrap())

1 Ответ

0 голосов
/ 23 января 2019

Пряди явно предназначены для выполнения только одной функции за раз.

Если вы используете асинхронные методы, тогда, когда одна функция ожидает, когда асинхронный метод вернет другие функции, будет разрешено выполнение в той же цепи.

Если вы не используете асинхронные методы, то цепочки просто выполнят опубликованные функции в последовательном порядке, как вы заметили.

...