使用异步调用与在线程中使用同步调用相同

Use an async call is the same of using a synchronous call in a thread?

本文关键字:调用 同步 异步 线程      更新时间:2023-10-16

我正在使用boost,并希望如果这样:

// --- some random function ---
boost::asio::io_service io;
boost::asio::ip::tcp::socket sock;
char b[256];
// connect and stuff here
boost::asio::async_read( sock,
    boost::asio::buffer(b, 256),
    boost::bind( &onRead, _1, _2)
    );

相同
// --- some random function ---
boost::asio::io_service io;
boost::asio::ip::tcp::socket sock;
boost::thread *read_thread;
char b[256];
// connect and stuff here
read_thread = new boost::thread( 
    boost::bind( &boost::asio::io_service::run, &( io))
    );
io.post( &read, b, sock);

// --- read function
bool read( char b[], boost::asio::ip::tcp::socket sock){
    boost::asio::read( sock,
        boost::asio::buffer(b, 256),
        boost::bind( &onRead, _1, _2)
        );
}

我只是想知道在异步调用中发生了什么,以及它与同步有什么不同。

编辑:我的主要问题是:异步调用阻塞与io_service绑定的线程?

编辑2:这解决了我的问题:http://www.ibm.com/developerworks/linux/library/l-async/?ca=dgr-lnxw02aUsingPOISIXAIOAPI

同步调用在完成其工作后返回,并且该工作的结果在下一个语句中可用。这样的调用很可能阻塞

异步调用立即返回,但工作状态不确定。当工作完成后,注册的回调函数由ioservice调用,并且由于您在单独的线程中运行该服务,因此回调也在该单独的线程中运行。

异步编程在控制流方面要困难得多,但在性能方面要优越得多。如果读和写是服务器正在进行的操作的一部分,那么使用异步模型几乎总是更好(尽管这可能是单线程的,只是不适合Boost)。另一方面,运行一次并按顺序执行一系列操作的简单工具可能只使用同步调用,这更易于编写和理解,并且如果您无论如何都需要等待操作的结果,则可能不会有什么不同。