实现
可以使用lambda表达式来实现执行函数,区分为有无返回值表达式
boost::container::map<long, std::vector<Ratel::Deliver::Driver::DrugStatisticalInfo>> deliverInventoryMap;
boost::function<bool()> function = [&]()->bool {
deliverInventoryMap = _mapDeliverInventory;
return true;
};
auto fut = _updateExecutor->postTask(function);
fut.get();
这是一个有返回值,返回值为bool的lambda表达式函数。在异步执行,等到function执行完成,返回true才会继续往下执行,达到一个单独给该函数内部上锁异步执行,整体同步执行的效果。
boost::container::map<long, std::vector<Ratel::Deliver::Driver::DrugStatisticalInfo>> deliverInventoryMap;
boost::function<void()> function = [&]()->void {
deliverInventoryMap = _mapDeliverInventory;
};
_updateExecutor->postTask(function);
而第二种lambda表达式是返回值为void,也可以说是没有返回值的函数。在异步执行时,function可能由于某种原因导致并没有执行完,但是程序不会等待它的返回,因此继续往下走,导致deliverInventory Map获取有误,这个时候的容器还未被赋值,即为空的情况下继续往下走,导致后续与之相关的逻辑操作都会出现错误,无法实现代码应有的功能。达到的是一个整个程序异步执行的效果。
结论
在需要整个函数运行完成后才继续往下走的时候,不管怎样,都要给该异步函数一个返回值,让程序等待它的返回,如果不需要等待它执行,那可以使用没有返回值的异步函数。