先对这里的异步任务做下解释: 这里的意思是,该任务有几种状态,创建,等待,运行,结束;其中等待是因为,该任务要正常运行,需要其他线程(或进程)提供相应的条件(或触发事件),然后才会运行。    针对这种要异步处理(等待)的任务队列管理模式,个人理解有两种处理方法。


第一种: 

也是最常规的一种,定义一个队列,创建任务,然后push到队列里面去,每个任务创建之后,(或接到开启命令)启动等待(定时器),等待所需条件(或事件),如果等待,那么就正常运行,然后结束,如果超时,那么就直接结束。  

这种方法的缺点就是,必须要有等待(定时器),这会消耗资源,影响效率。

优点就是不会有任务丢失。


第二种:

定义一个定长(较大)的任务数组, 任务全部初始化为创建状态,当有一个任务来的时候,那么就查询数组中free的任务obj,注意这里查询,要从上一个已经使用的index往后查,(比如,现在已经存了3个有效任务,每次使用一个新的,都会记录index, 那么index应该等于2,那么要查找未被使用的任务obj,这里应该从index=3开始查,这样就不会把之前的任务冲掉) ,查的时候,只要状态不是在运行就可以。   注意:这里其实已启用的任务,可能是出于等待状态的,那么当它的运行条件(事件)来的时候,那么就要从之前已经存的启动任务中去找(这里要从记录的index往前找,因为我们记录的顺序是从前往后的,前面的都是在等待或者已经运行了的),当找到后,就将任务状态改为运行。

这里写的有些含糊,但是只要细细理解,应该就能明白,这其实就是一个循环利用一开始就申请好的数组队列。

这中方法的优点就是 不用启用定时器,节省资源,效率高,且不会有僵尸任务(比如方法一种如果没有定时器,那么就有可能出现一直在等待的任务)出现。 缺点就是,最多只能有一开始创建的数组大小个任务并行(这个缺点,可以通过变长数组,或vector解决),还有一个缺点就是,有可能会有前面的等待任务,误被当做free任务obj而被冲掉,所以这种方法适合那种快速响应的异步任务(就是它创建了,它对应的启动运行条件很快就会来,等待时间很短)。



两种方法各有优缺点,需根据不同情况选择。