gpt4 book ai didi

c++ - 在多线程场景中提升 asio async_receive_from 缓冲消息

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:00 27 4
gpt4 key购买 nike

class UDP_Receiver
{
public:
udp_receiver((boost::asio::io_service& io_service) :
idle_work_(io_service_),
socket_(new boost::asio::ip::udp::socket(io_service))
{
}

void start_receive()
{
socket_.async_receive_from(boost::asio::buffer(buffer, buffer.size()),
remote_endpoint_,
[&](boost::system::error_code const& ec, std::size_t N)
{
if (!ec.value())
{
std::unique_ptr<char[]> custom_buffer_ptr(new char[N], std::default_delete<char[]>());
std::memcopy(custom_buffer, &buffer.data(), N);

do_custom_stuff(std::move(custom_buffer), N);
}
}
}

private:
std::array<char, 6000> buffer;
boost::asio::ip::udp::socket socket_;
boost::asio::io_service::work idle_work_;
};

int main()
{
std::size_t numberOfThreads = 2;
std::vector<std::thread> workerThreads;

boost::asio::io_service io_service_;

UDP_Receiver udp_receiver(io_service_);

for(size_t i = 0; i < numberOfThreads; i++) {
workerThreads.push_back(std::thread([&] { io_service().run(); }));
}

for(auto &thread : workerThreads){
thread.join();
}
}

我场景中的io_service是由两个线程处理的。现在我调查这个问题,例如,如果两个 udp 消息直接接连接收,缓冲区只保存最后一条消息。

所以一条消息被丢弃了。有没有一种线程安全的方式来保证所有接收到的 udp 数据包都被单独缓冲和 memcopyed没有消息丢失?

例如 stream_buffer 是解决方案吗?

最佳答案

使用缓冲区集合不是更好的主意吗 - 类似于 std::vector<std::array<char, 6000>> bufferCollection然后使用 start_receive() 中的锁保护它.这样,您就可以安全地继续填充它。您可以使用 std::map如果你想用一些键来区分缓冲区。

关于c++ - 在多线程场景中提升 asio async_receive_from 缓冲消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48673998/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com