C++ C++;如何同时运行2 boost:asio:io_上下文

C++ C++;如何同时运行2 boost:asio:io_上下文,c++,boost,C++,Boost,我有2个boost::asio::io_context变量,一个用于Raspberry Pi和arduino之间的连接,另一个用于Raspberry Pi和客户端之间通过tcp服务器的连接。 我分别测试了两个连接,它们工作得非常好。然而,当我尝试加入他们时,它不起作用。我知道,通过设置两个io.run,第二个将永远不会被输入,因为程序将被卡在第一个io.run中,因此如何将io.run插入io_context.run()中 我的主要意见如下: boost::asio::io_context io

我有2个
boost::asio::io_context
变量,一个用于Raspberry Pi和arduino之间的连接,另一个用于Raspberry Pi和客户端之间通过tcp服务器的连接。 我分别测试了两个连接,它们工作得非常好。然而,当我尝试加入他们时,它不起作用。我知道,通过设置两个io.run,第二个将永远不会被输入,因为程序将被卡在第一个io.run中,因此如何将io.run插入io_context.run()中

我的主要意见如下:

boost::asio::io_context io_context;
boost::asio::io_context io;
int main{
  //create a server object to accept incoming client connections
  tcp_server server(io_context);

  open_port_arduino();
  
  start = std::chrono::high_resolution_clock::now(); //time_init
  //writes to arduino with intervals of 2 seconds
  tim.expires_after(boost::asio::chrono::seconds {2});
  tim.async_wait(timer_handler);
  //reads from arduino
  start_read_arduino();

  io.run();
  io_context.run();
}
回复:您不需要第二个io_上下文

但是,您可以(另请参见和)

一个好处可能是线程隔离:如果您在不同的线程上运行不同的上下文,则存在隐式任务序列化。(与多线程上的单个上下文相反,在多线程上,任务可能需要手动序列化,例如使用串)

我认为,要“修复”它,最直截了当的方法就是将对同一io_服务的引用传递给各方:

static io_context io;

struct tcp_server {
    tcp_server(io_context& ctx) : _ctx(ctx) {}
  private:
    io_context& _ctx; // REFERENCE
};

int main() {
    tcp_server server(io);

    // ...
(现场演示按预期打印“计时器回调:成功”)

多线程 如果某些IO任务阻塞了相当长的时间,则需要运行多个线程。在这种情况下,我将切换将执行器传递给类的方法,并确保它们将其包装成多股:

boost::asio::thread_pool io(2); // two threads
using boost::asio::any_io_executor;

struct tcp_server {
    tcp_server(any_io_executor ex) : _ex(make_strand(ex)) {}
  private:
    any_io_executor _ex;
};
然后

int main() {
    //create a server object to accept incoming client connections
    tcp_server server(io.get_executor());

同样,按预期打印“计时器回调:成功”。

但是为什么需要两个
boost::asio::io_context
实例?我分别为tcp_服务器和客户端以及rpi和arduino之间的连接编写了代码。我假设需要两个
boost:asio\u io\u context
。但也许只有一个?但是我如何实现这两个连接呢?我假设每个连接都应该与io_contextOK关联,所以两个连接都应该在两个线程中完成。但是唯一的tcp_连接是在rpi和客户端之间。arduino和rpi之间的连接使用arduino的串行端口,因此我怎么会不明白如何为这两个连接创建线程,特别是对于arduino rpi连接