C++ C++;如何同时运行2 boost:asio:io_上下文
我有2个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
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连接