The other way is to use an asio steady_timer. You would cancel the timer in order to signal the condition. The waiter would see this as an operation_aborted error, which would indicate, "you have been signalled".You can set the timer to expires_at(std::chrono::steady_clock::max()) to indicate that the wait should be indefinite.