Я писал код asio и пытался его реорганизовать, чтобы использовать сопрограммы C ++ 20. Однако я застрял при преобразовании этого кода:

asio::post(
    my_strand,
    [self = shared_from_this()]() {
        // functions that write in this container can only be called
        // on a single thread at a time, thus the strand
        session_write_history.push_back(buffer);
        /* co_await? */ socket.write_async(buffer, /* use awaitable? */);
    }
);

Видите ли, моя асинхронная операция выполняется внутри обратного вызова post, поэтому, используя asio::use_awaitable в операции async, можно сделать обратный вызов сопрограммой. Есть ли способ ожидать выполнения асинхронной операции внутри asio::post в цепочке?

1
Guillaume Racicot 16 Фев 2021 в 17:36

1 ответ

Лучший ответ

Просто отправьте asio::use_awaitable вместо обратного вызова для публикации. Это сделает вашу функцию ожидаемой. Затем вы сможете помещать свои асинхронные вызовы прямо в свою функцию:

co_await asio::post(my_strand, asio::use_awaitable);
// ...
// code that runs on the strands context
// ...
co_await socket.async_write_some(buffer, asio::use_awaitable);

Фактически, вы можете использовать asio::use_awaitable в любом месте, где вы поместили бы обратный вызов, поэтому преобразование асинхронного кода обратного вызова в сопрограммы может быть выполнено практически 1: 1

2
2 revs 16 Фев 2021 в 22:36