Я недавно использовал 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()
)