我有一个线程可以监听套接字,读取传入的数据包,处理它们并将它们发送到另一个套接字。
我想通过在不改变数据包顺序的情况下为数据包处理添加专用线程来加速此流程。
我已经定义了一个运行所有套接字活动的 io_context 的线程:
std::thread th([&] {
log_info("reading packets from sockets thread");
boost::asio::steady_timer timer(read_ioc_);
timer.expires_after(std::chrono::hours(3));
timer.async_wait(
[]([[maybe_unused]] const boost::system::error_code& error) {
log("got timeout");
});
read_ioc_.run();
log_info("thread stopped");
});
std::thread th2([&] {
log_info("processing packets");
boost::asio::steady_timer timer(process_ioc_);
timer.expires_after(std::chrono::hours(3));
timer.async_wait(
[]([[maybe_unused]] const boost::system::error_code& error) {
log("got timeout");
});
process_ioc_.run();
log_info("processing stopped");
});
th.detach();
th2.detach();
在处理数据包读取和数据包处理的类中。我将获得 2 个 io 上下文对象,并从中创建一个套接字和一个链。套接字将用于连续读取接收到的数据包或等待新数据包到达套接字。 ioc_process 将用于按顺序处理数据包(假设它正在加密每个数据包并添加其他标头,如某些隧道协议)
myClass::myClass(boost::asio::io_context &ioc_process, boost::asio::io_context &ioc_process
) : socket_(read_ioc), strand_(process_ioc) ...
myClass::startReadPacketLoop() {
...
readPacketLoop();
...
}
这是我将刚刚读取的数据包放入队列并进行下一次读取的循环。
我的问题是我是否可以保持数据包顺序但有多个线程同时处理数据包。我可以使用共享队列实现它还是用 ioc_process 替换链?在这种情况下我将如何保持顺序(假设我将数据包写入另一个套接字并且我希望它们是有序的)
void myClass::readPacketLoop(std::shared_ptr<Packet> pkt,
const boost::system::error_code& error,
size_t bytes_transferred) {
std::shared_ptr<Packet> pkt = freeList.alloc();
socket_.async_receive(boost::asio::buffer(pkt->buffer(), pkt->buffer_size()),
std::bind(&myClass::readPacketLoop);
boost::asio::post(strand_, [=] {
process_packet(pkt, error, bytes_transferred);
});