相关疑难解决方法(0)

asio 如何更改等待中的执行者?

我已阅读此问题并尝试使用以下代码复制答案:

#include <iostream>
#include <syncstream>
#include <thread>
#include <coroutine>
#include <boost/asio.hpp>
#include <boost/asio/experimental/as_single.hpp>
#include <boost/bind/bind.hpp>
#include <boost/thread/thread.hpp>

inline std::osyncstream tout() {
  auto hash = std::hash<std::thread::id>{}(std::this_thread::get_id());
  return std::osyncstream(std::cout) << "T" << hash << " ";
}

namespace asio = boost::asio;

asio::awaitable<void> mainCo(asio::io_context &appIO, asio::io_context &prodIO) {
  // the thread should also change when using the IO contexts directly.
  auto astrand = asio::io_context::strand{appIO};
  auto pstrand = asio::io_context::strand{prodIO};

  tout() << "MC on APPIO" << std::endl;
  co_await asio::post(pstrand, asio::use_awaitable);
  tout() << …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-asio c++20 c++-coroutine

8
推荐指数
1
解决办法
1493
查看次数

ASIO:是否定义了在不同线程中运行完成处理程序的行为?

在以下示例中,计时器与 io_context 执行器关联。但随后,处理程序被告知在线程池中执行。原因是,因为处理程序实际上执行的是阻塞代码,而我不想阻塞runio_context的函数。

但文档指出

处理程序仅由当前正在为 io_context 调用 run()、run_one()、run_for()、run_until()、poll() 或 poll_one() 的任何重载的线程调用。

如代码所示,处理程序由 thread_pool 在run. 这种行为定义明确吗?它也适用于套接字吗?

#include <boost/asio.hpp>
#include <iostream>

int main() {
    using namespace boost::asio;
    thread_pool tp(4);

    io_context ioc;
    deadline_timer dt(ioc, boost::posix_time::milliseconds(500));
    dt.async_wait(bind_executor(tp, [&](boost::system::error_code){
        std::cout << "running in tp: " << tp.get_executor().running_in_this_thread() << std::endl;
        std::cout << "running in ioc: " << ioc.get_executor().running_in_this_thread() << std::endl;
        exit(0);
    }));

    auto wg = make_work_guard(ioc);
    ioc.run(); 
}
Run Code Online (Sandbox Code Playgroud)
running in tp: 1
running in ioc: 0
Run Code Online (Sandbox Code Playgroud)

神箭链接

c++ boost asynchronous boost-asio c++20

6
推荐指数
1
解决办法
941
查看次数

asio::strand&lt;asio::io_context::executor_type&gt; 与 io_context::strand

自最新版本的 boost 以来,asio 推出了新的执行器并提供了asio::strand<Executor>. 所以现在完全可以使用asio::strand<asio::io_context::executor_type>来代替io_context::strand. 但它们不能互换使用。

  • 有人可以用例子解释一下用法有什么区别吗?
  • 与其他相比,它们的优势/不便之处?

c++ boost-asio

5
推荐指数
1
解决办法
3424
查看次数

如何在其链的上下文中恢复执行堆栈协程?

using Yield = asio::yield_context;
using boost::system::error_code;
int Func(Yield yield) {
  error_code ec;
  asio::detail::async_result_init<Yield, void(error_code, int)> init(yield[ec]);
  std::thread th(std::bind(Process, init.handler));
  int result = init.result.get();  // <--- yield at here
  return result;
}
Run Code Online (Sandbox Code Playgroud)

如何实现,Process以便FuncFunc最初产生的链的上下文中恢复?

c++ boost boost-asio c++11

4
推荐指数
2
解决办法
1851
查看次数

标签 统计

boost-asio ×4

c++ ×4

boost ×3

c++20 ×2

asynchronous ×1

c++-coroutine ×1

c++11 ×1