如何在其他线程中运行io_service?

时间:2016-05-22 16:19:45

标签: c++ boost udp boost-asio

我正在尝试运行udp服务器。问题是阻止对io_service的run()调用。 所以我决定使用boost bind在其他线程上运行此方法。 结果主线程执行超出了DictionaryImpl构造函数范围,但是当我发送udp包时,tcpdump告诉我我的端口无法访问。 当我在主线程中调用io_service上的run()调用时,一切正常。 哪里有问题?

class DictionaryImpl  {
    boost::asio::io_service io;
    boost::scoped_ptr<boost::thread> thread;

public:
    DictionaryImpl() {
        try {
            udp_server2 udpReceiver(io);

            thread.reset(new boost::thread(
                    boost::bind(&DictionaryImpl::g, this, std::ref(io))));

        } catch (std::exception &e) {
            std::cerr << "Exception: " << e.what() << "\n";
        }

    }

    void g(boost::asio::io_service & io){
        io.run();
    }

    virtual ~DictionaryImpl() {
        if (!thread) return; // stopped
        io.stop();
        thread->join();
        io.reset();
        thread.reset();
    }

};






class udp_server2
{
public:
    udp_server2(boost::asio::io_service& io_service)
            : socket_(io_service, udp::endpoint(udp::v4(), 13003))
    {
        start_receive();
    }

private:
    void start_receive()
    {
        socket_.async_receive_from(
                boost::asio::buffer(recv_buffer_), remote_endpoint_,
                boost::bind(&udp_server2::handle_receive, this,
                            boost::asio::placeholders::error,
                            boost::asio::placeholders::bytes_transferred));
    }

    void handle_receive(const boost::system::error_code& error,
                        std::size_t /*bytes_transferred*/)
    {
        if (!error || error == boost::asio::error::message_size)
        {
            std::cout<<"handle_receive\n";    
            start_receive();
        }
    }



    udp::socket socket_;
    udp::endpoint remote_endpoint_;
    boost::array<char, 1> recv_buffer_;
};

1 个答案:

答案 0 :(得分:1)

DictionaryImpl io_service将在用完工作时停止。您可以使用asio::io_service::work

来阻止这种情况

~DictionaryImplreset上致电stop后,您正在呼叫io_service。您唯一想要这样做的时间是您打算随后重新启动io_service

看起来您将从重新访问文档中受益(我接受的文档有点稀疏)。另请参阅asio文档中的多线程示例。他们将展示使用work对象的示例。