Вот минимальный пример, который демонстрирует проблему:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
namespace asio = boost::asio;
asio::io_context ioc;
int main() {
const int iterations = 100000;
boost::latch countRunning{iterations};
std::atomic_int done = 0;
auto workGuard = asio::make_work_guard(ioc);
std::vector threads;
for (int i = 0; i < 20; ++i)
threads.emplace_back([] { ioc.run(); });
for (int i = 0; i < iterations; ++i) {
auto timer = std::make_shared(ioc, std::chrono::seconds(100));
asio::co_spawn(
ioc,
[&, timer]() -> asio::awaitable {
asio::experimental::concurrent_channel c(ioc, 1);
asio::co_spawn(
ioc,
[&, timer]() -> asio::awaitable {
boost::system::error_code ec;
co_await c.async_receive(asio::redirect_error(asio::use_awaitable, ec));
timer->expires_after(std::chrono::seconds{});
co_return;
},
asio::detached);
boost::system::error_code ec;
c.close();
co_await timer->async_wait(asio::redirect_error(asio::use_awaitable, ec));
++done;
countRunning.count_down();
co_return;
},
asio::detached);
}
if (countRunning.wait_for(boost::chrono::seconds(2)) != boost::cv_status::no_timeout) {
std::cout async_wait Код: Выделить всё
class Timer {
std::mutex mutex_;
asio::steady_timer timer_;
public:
Timer(asio::io_context& io, asio::steady_timer::duration d) : timer_(io, d) {}
void ExpiresNow() {
std::scoped_lock lock(mutex_);
timer_.expires_after(std::chrono::seconds{});
}
template
auto AsyncWait(Token&& token) {
std::scoped_lock lock(mutex_);
return timer_.async_wait(std::forward(token));
}
};
< /code>
… но это не имело никакого эффекта. Он все еще висит при использовании async_receive Подробнее здесь: https://stackoverflow.com/questions/797 ... teady-time
Мобильная версия