I'm using asio's awaitable. Couroutines are pretty neat.

One of the things that keeps cropping up in the ability to notify another function that something has finished. In the past, I would use condition_variable and wait on that.

Is there a better way to do that with coroutines? eg, I want to do something like:

asio::awaitable<void>
function(std::mutex& mtx, condition_variable& cv)
{
    std::unique_lock lock{mtx};

    // suspend this function until notified or 30 seconds expired
    auto expired = co_await cv.wait_until(lock, std::chrono::seconds(30));
    if (expired)
    {
        // or something
        log("expired");
        co_return;
    }

    do_some_work();
}


then somewhere else I might do:

asio::awaitable<void>
somewhere_else(condition_variable& cv)
{
    do_other_work();
    cv.notify_one();
}

I understand that it's a bad idea to hold a lock during co_await. What other problems prevent something like this from being created? Does something like this already exist? It's not clear from asio reference. I'm using boost 1.81.0 but I can upgrade if that is a problem

--
Keith Bennett