ASIO Executors
C++11 标准库为我们执行异步任务提供了一个接口 async,一般这个接口里面会创建一个线程来执行。
std::future<int> f = std::async([]{
// ...
return 42;
});
int i = f.get();
Boost 1.74 ASIO 开始支持 executors,能够以不同方式执行异步任务。
std::future<int> f = post(
package([]{
// ...
return 42;
})
);
int i = f.get()
Executor
执行器是用来管理一个函数对象在什么时候,在什么地点,以何种方式执行一个函数对象的一组规则集。它提供了 context() 来访问执行上下文,以及 dispatch, post, defer 操作。
特点:可以持续或短暂存活,是一个轻量可拷贝的对象。
Execution context
执行上下文是指一个用来执行函数对象的场所。可以通过 get_executor() 来获取执行上下文关联的执行器,也就说获取的这个执行器执行函数对象时将在这个上下文上执行。
特点:一般在程序运行期间持续存活,并且不允许被拷贝。
比如:system_context, static_thread_pool
Dispatch, post and defer
这是用于提交用来执行的函数对象的三个基本操作,它们之间的不同体现在执行函数的迫切程度。
dispatch如果当前在执行上下文上将立即执行函数,否则执行post操作。post无论当前是否在执行上下文上都会将函数排队,然后唤醒一个线程来执行它。defer如果当前在执行上下文上会将函数排队,但是不会唤醒线程来执行它,而等待当前的控制回到执行上下文后再执行,否则执行post操作。