Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost::Asio。消息在哪个线程中发送?_C++_Multithreading_Boost Asio - Fatal编程技术网

C++ Boost::Asio。消息在哪个线程中发送?

C++ Boost::Asio。消息在哪个线程中发送?,c++,multithreading,boost-asio,C++,Multithreading,Boost Asio,我试图理解boost::asio库的内部工作,这真是太棒了。我编写了一个简单的客户端,它向服务器发送一条消息 问题是-它在哪个线程中真正发送消息 因为我使用了async\u write()方法,所以它在调用后立即返回,不发送任何内容。我已经注释了io\u service.run()方法,之后没有调用处理程序(没关系),但是消息被发送了!(我已经在服务器日志中检查过) 顺便说一下,我没有使用-lpthread,只是在编译时使用-lboost\u system,因此我假设整个程序在一个线程中工作,并

我试图理解
boost::asio
库的内部工作,这真是太棒了。我编写了一个简单的客户端,它向服务器发送一条消息

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

因为我使用了
async\u write()
方法,所以它在调用后立即返回,不发送任何内容。我已经注释了
io\u service.run()
方法,之后没有调用处理程序(没关系),但是消息被发送了!(我已经在服务器日志中检查过)

顺便说一下,我没有使用
-lpthread
,只是在编译时使用
-lboost\u 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;
}
#包括
#包括
常量std::字符串str(“你好!”);
int main()
{
boost::asio::io_服务io_服务;
boost::asio::ip::tcp::endpoint端点(boost::asio::ip::address::from_string(“127.0.0.1”),33333);
boost::asio::ip::tcp::socket套接字(io_服务);
boost::system::error_code ec;
boost::asio::connect(套接字和端点,ec);
boost::asio::async_写入(套接字,boost::asio::buffer(str),
[](常量boost::system::error\u code&ec,std::size\u t length)
{
如果(!ec)
{

std::cout消息可能已经发送(或者至少在网络堆栈中排队,可能由内核线程处理,或者其他一些您不需要关心的依赖于实现的机制)在调用
async\u write
的过程中,如果可以在不阻塞调用线程的情况下完成此操作,则无需推迟


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

您的“发送”输出是否显示在控制台上?当然需要io_服务.run()。您是否完全确定您的日志来自上一次运行?@MartinMeeser,“发送!”仅在io_服务.run()时显示是未注释的,我理解,没关系。我完全确定服务器接收消息的事实。感谢您的见解。但是,请您在>中添加一两个词,问题是-它真正在哪个线程中发送消息?迈克,谢谢。那么同步写什么()方法do?它是否等待来自内核的消息被发送或未被发送的响应?@MartinMeeser:“它真正在哪个线程中发送消息?”这是网络堆栈实现的一个细节。调用
async_write
的线程或一个线程(可能是内核线程)由堆栈管理。或者,如果使用DMA,则根本没有线程。这不是应用程序编写器应该关心的问题。“那么同步write()方法做什么?它是否等待内核发出消息的响应?”是-它等待完成并返回结果,而不是稍后通过完成处理程序报告结果。