升压::短耳。消息发送到哪个线程?

时间:2014-07-16 08:47:49

标签: c++ multithreading boost-asio

我正在努力了解boost::asio库的内部工作,这非常棒。我写了一个简单的客户端,它将一条消息发送到服务器。

问题是 - 它在哪个线程中真正发送了消息?

由于我使用async_write()方法,它在调用后立即返回,并且不发送任何内容。我已经评论了io_service.run()方法,之后没有调用处理程序(没关系),但是消息已经发送了! (我在服务器日志中检查了它)

顺便说一句,我在编译时不使用-lpthread,只使用-lboost_system,所以我假设整个程序在一个线程中工作,并且没有“隐藏”线程。

我不能发出消息发送到何处的头部或尾部。

#include <iostream>
#include <boost/asio.hpp>

const std::string str("HELLO!");

int main()
{
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 33333);
    boost::asio::ip::tcp::socket socket(io_service);
    boost::system::error_code ec;
    boost::asio::connect(socket, &endpoint, ec);
    boost::asio::async_write(socket, boost::asio::buffer(str),
                             [](const boost::system::error_code& ec, std::size_t length)
                             {
                                 if (!ec)
                                 {
                                     std::cout << "Sent!" << std::endl;
                                 }
                                 else
                                 {
                                     std::cout << "Err: " << ec.message() << std::endl;
                                 }
    });

    //io_service.run();
    return 0;
}

1 个答案:

答案 0 :(得分:2)

在调用{期间}消息将被发送(或者至少在网络堆栈中排队,可能由内核线程处理,或者您不需要关心的其他一些与实现相关的机制) {1}}。没有必要推迟,如果可以在不阻塞调用线程的情况下完成,通常可以这样做。

async_write运行之前,不会调用完成处理程序,并通知消息已发送。