使用异步调用与在线程中使用同步调用相同
Use an async call is the same of using a synchronous call in a thread?
我正在使用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)。另一方面,运行一次并按顺序执行一系列操作的简单工具可能只使用同步调用,这更易于编写和理解,并且如果您无论如何都需要等待操作的结果,则可能不会有什么不同。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- ofstream::close() 是否在 Linux 上调用同步?
- Vulkan是否需要在多个具有透明度的平局调用之间进行同步
- 关于C++ REST SDK 和同步调用
- 异步操作的 Asio 处理程序在其同步对应项正常工作时不会调用
- 使用 P/调用传递取消标志时是否需要同步
- 从多个线程对共享对象的同步方法调用
- 嵌入在c中的Python.正在调用pyrun_simplestring同步
- 可以使对AudioObjectSetPropertyData的调用同步吗
- 如何从另一个线程的 cpp 代码同步调用 qml 信号处理程序
- C++:如何异步调用同步库调用
- 为什么std::async即使指定了std::launch::async标志,也要同步调用函数?
- 同步来自多个对象的异步调用
- 对运算符的调用是否'delete'同步的?
- 当调用ReadDirectoryChangesW时,只有第一次调用返回任何更改(同步和异步)
- c++ /Boost:跨多个方法(getter)调用同步对资源的访问
- 是boost::信号槽被同步或异步调用
- 使用异步调用与在线程中使用同步调用相同
- 如何使用 MethodInvoker 委托在 cli c++ 中同步对控件线程的调用