Boost.asio coroutine висит при использовании как `concurrent_channel`, так и` steady_timer`C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Boost.asio coroutine висит при использовании как `concurrent_channel`, так и` steady_timer`

Сообщение Anonymous »

Я сталкиваюсь с странной проблемой, используя COOST.ASIO CORUTINES в сочетании с steady_timer и Experimental :: complorrent_channel . Некоторые Coroutines никогда не возвращаются из Timer-> Async_wait .
Вот минимальный пример, который демонстрирует проблему:

Код: Выделить всё

#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 
Если я удалить Async_receive Call , все работает нормально-все Coroutines завершены, как и ожидалось. /> < /ul>

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»