1

我正在使用包装类来表示网络连接。我的实现包含一个名为 的方法async_connect(),它解析主机/服务并连接到相关端点(如果可能)。像这样的东西:

void tcp::connection::async_connect(std::string const& host, std::string const& service,
    protocol_type tcp = protocol_type::v4())
{
    std::cout << "thread [" << boost::this_thread::get_id() << "] tcp::connection::async_connect()" << std::endl;

    resolver(m_io_service).async_resolve(resolver::query(tcp, host, service),
        boost::bind(&connection::resolve_handler, this, _1, _2));
}

我想知道的是从处理程序建立连接,由方法完成调用async_resolve

我不确定是使用主线程还是工作线程来调用处理程序。因此,我应该调用socket::connect()(如果该代码将从工作线程执行,这将是最明智的方式)还是再次启动异步操作(socket::async_connect()- 应该在由主线程执行时使用)。

void tcp::connection::resolve_handler(boost::system::error_code const& resolve_error,
    tcp::resolver::iterator endpoint_iterator)
{
    std::cout << "thread [" << boost::this_thread::get_id() << "] tcp::connection::resolve_handler()" << std::endl;

    if (!resolve_error)
    {
        boost::system::error_code ec;
        m_socket.connect(*endpoint_iterator, ec);
    }
}

我观察到 - 从控制台输出 - myresolve_handler是从工作线程调用的。那么,在这里打电话可以socket::connect()吗?

4

1 回答 1

2

IMO在使用 asio 时最好坚持单一的编程模型。

您可以自由使用 asio 的同步(阻塞)调用,您可以在其中调用许多方法(解析、连接等),并且每个方法都会阻塞,直到结果或错误可用。

但是,如果您使用的是异步编程模型,您的主线程或调用线程通常会在 io_service::run 上被阻塞,并且从不同的线程调用指定的处理程序(如您所描述的情况)。使用此编程模型时,您通常会从处理程序(工作线程)调用下一个异步方法,因此您将调用 socket::async_connect,而不是调用 socket::connect。在我看来,您正在尝试混合两种不同的模型。我不确定混合这两种模型(在 io_service::run 上阻塞调用线程)和从处理程序调用同步方法的含义是什么。

于 2011-10-02T08:24:35.750 回答