我正在使用提升,并希望如果:
// --- 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
答案 0 :(得分:3)
同步调用在执行其工作时返回,并且工作结果在下一个语句中可用。这样的调用很可能阻止。
异步调用立即返回,但工作状态是不确定的。完成工作后,ioservice将调用已注册的回调函数,并且由于您在单独的线程中运行该服务,因此回调也会在该单独的线程中运行。
异步编程在控制流方面要困难得多,但在性能方面却非常优越。如果读取和写入是服务器正在进行的操作的一部分,那么使用异步模型几乎总是更好(尽管这可能是单线程的,而不是Boost)。另一方面,运行一次并按顺序执行大量操作的简单工具可能只使用同步调用,这种编写和理解更简单,如果您需要等待操作的结果,则可能没有区别反正。