本发明专利技术适用于计算机软件应用领域,提供了一种多对象阻塞方法及其系统。所述方法包括:系统发送待处理任务到队列,调用所述队列上预先注册的通知函数,所述通知函数发送消息到预先设置的网关,唤醒线程,所述线程判断所述队列上的记录值,根据判断结果执行待处理任务。通过上述方法通过在线程上设置的网关,可以使线程能够同时等待多个队列,在多个队列上均有待处理任务时做到及时处理。本实施例中通过在线程上设置一网关来实现线程对多目标对象的阻塞,实现方法简单,大大降低了软件设计的难度。
【技术实现步骤摘要】
一种多对象阻塞方法及其系统
本专利技术实施例属于计算机软件应用领域,尤其涉及一种多对象阻塞方法及其系统。
技术介绍
线程阻塞通常是指一个线程在执行过程中暂停,以等待某个条件的触发。当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间,直到线程重新进入就绪状态,它才有可能执行操作。现有的软件系统中,存在多个队列的线程,虽然任意队列接收到任务处理消息时都可将线程唤醒,但线程仅能等待其中一个队列上待处理任务的出现,也就是说,其中一个队列上接收到待处理任务而将线程唤醒时,线程便不再等待其他队列。而对于某个线程来说,它往往需要同时阻塞于信号量及消息队列或者多个消息队列,当线程收到同步信号或者消息时需要马上对信号或者消息进行处理,但现有技术中当前阻塞线程被唤醒后,会优先执行最先唤醒线程的任务队列或信号量,从而导致线程无法同时接收到多个消息队列任务,并对其进行处理。故,需要一种能够实现单线程阻塞于多个目标对象的方法。
技术实现思路
本专利技术实施例提供了一种多对象阻塞方法,旨在解决现有的方法中,单线程中多队列同时接收任务处理消息时,线程无法及时处理待处理任务的问题。本专利技术实施例的第一方面,提供一种多对象阻塞方法,所述方法包括:系统发送待处理任务到队列,调用所述队列上预先注册的通知函数;所述通知函数发送消息到预先设置的网关,唤醒线程;所述线程判断所述队列上的记录值,根据判断结果执行待处理任务。本专利技术实施例的第二方面,提供一种多对象阻塞系统,所述系统包括:函数调用单元,用于发送待处理任务到队列,调用所述队列上预先注册的通知函数;通知函数,用于发送消息到预先设置的网关,唤醒线程;线程,用于判断所述队列上的记录值,根据判断结果执行待处理任务。在本专利技术实施例中,当系统调用一个队列进行任务处理时,自动调用队列上预先注册的通知函数,通知函数发送消息到预先设置的网关,网关接收到上述通知函数发送的消息后便唤醒线程,由线程对队列进行判断后,接收并运行队列上的待处理任务。通过在线程上设置的网关,可以使线程能够同时等待多个队列,在多个队列上均有待处理任务时做到及时处理。本实施例中通过在线程上设置一网关来实现线程对多目标对象的阻塞,实现方法简单,大大降低了软件设计的难度。附图说明图1是本专利技术第一实施例提供的一种多对象阻塞方法的流程图;图2是本专利技术第二实施例提供的一种多对象阻塞系统的结构图。具体实施方式为了使本专利技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本专利技术进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本专利技术,并不用于限定本专利技术。本专利技术实施例中,系统调用队列处理任务时,调用队列上预先设置的通知函数,所述通知函数被调用后,发送消息到预先设置的网关,网关接收通知函数发送的消息后启动线程,线程对队列进行判断,接收并运行待处理任务。为了说明本专利技术所述的技术方案,下面通过具体实施例来进行说明。实施例一:图1示出了本专利技术第一实施例提供的一种多对象阻塞方法的流程图,详述如下:步骤S110,系统发送待处理任务到队列,调用所述队列上预先注册的通知函数;操作系统中处于阻塞状态的线程往往只能等待一项待处理任务,当一个队列上接收到待处理任务时,线程便被唤醒去处理所述队列上待处理任务,而不能继续等待其他队列;但单个线程往往需要同时阻塞于信号量及任务队列或者多个任务队列等,当线程收到同步信号或者待处理任务时需要马上对信号或者待处理任务进行处理。因此,在该步骤中,系统调用队列进行任务处理时,首先调用队列上预先设置的一个具有函数通知功能的通知函数。例如,通过函数:yh_semphore_send_notify(&sem1,notify_function),注册一个通知函数notify_function到信号量sem1上,当用户使用函数yh_semaphore_put的时候就可以触发此通知函数。同样对于队列也有此功能,通过函数:yh_queue_send_notify(&queue1,notify_function),可预先注册一个通知函数notify_function到队列上,当用户使用函数yh_queue_post时会触发此通知函数,其它的接口设计都跟以上类同。进一步地,在所述系统发送待处理任务到队列,调用所述队列上预先注册的通知函数之后,还包括:所述队列将自身的记录值加1,并返回记录值,所述记录值与队列的任务数量对应。在系统调用队列处理任务,并调用队列上的注册函数后,队列存储所接受的待处理任务,并在任务数量记录模块更改队列所持有的任务数量;队列每接收一个待处理任务,任务数量记录模块的记录值便增加1,记录值更改后存储在任务数量记录模块,并返回此记录值给系统。当队列上不存在待处理任务时,所述记录值显示为0。队列上待处理任务被运行后,所述记录值减小1,并存储。步骤S120,所述通知函数发送消息到预先设置的网关,唤醒线程。该步骤中,系统调用队列上通知函数notify_function后,所述通知函数向预先设置的网关发送消息。所述消息为一信号量。当队列上不含待处理任务时,所述线程阻塞于所述网关处。所述网关接收所述通知函数发送的消息后唤醒线程。进一步地,在所述通知函数发送消息到预先设置的网关之后包括:所述网关内部计数器的值更改为1。队列上通知函数notify_function由于被触发而发送的消息被网关接收后,网关内部设置的计数器值更改为1,所述计数器的值表征是否需要线程接收待执行任务;当所述计数器值变为1时,说明队列上有需要处理的任务,因此,唤醒线程接收队列上待处理任务。步骤S130,所述线程判断所述队列上的记录值,根据判断结果执行待处理任务。该步骤中,线程被唤醒后,调用队列任务数量记录模块的记录值,对其进行判断,具体包括,线程判断某一个队列上任务数据记录模块的记录值,若所述记录值不为0,说明该队列上有待处理任务,线程接收待处理任务并运行;若所述记录值为0,说明该队列为空,则线程执行立刻返回功能,继续调用下一个队列上的记录值,对其进行判断。进一步地,判断所述线程是否已运行所述队列上的待处理任务,在所述线程已运行所述队列上的待处理任务后,所述网关内部计数器值自动调整为0。在线程判断队列上有待处理任务,接收并运行所述待处理任务后,所述网关判断线程成功接收队列上待处理任务后,将自身内部计数器的数值自动调整为0。当所述网关内部计数器数值为0时,说明该线程处于阻塞状态。因此,即使某一队列上的任务正在被执行,也不会影响线程通过网关继续等待其他队列。当其他任一队列上接收到待处理任务时,即可通过通知函数发送消息给网关,由网关再次唤醒线程,进而使线程继续接收另一队列上待执行任务,队列之间互不影响。实现了单线程对多目标对象的阻塞。本专利技术第一实施例中,当系统调用一个队列进行任务处理时,自动调用队列上预先注册的通知函数;通知函数发送一信号量到预先设置的网关;网关接收到上述通知函数发送的信号量后便唤醒线程,由线程对队列进行判断后,接收并运行队列上的待处理任务。通过在线程上设置一网关,可以使线程能够同时等待多个队列,在多个队列上均有待处理任务时做到及时处理。本实施例中通过在线程上设置一网关来实现线程对多目标对象的阻塞,实现方法简单,大本文档来自技高网...
【技术保护点】
一种多对象阻塞方法,其特征在于,所述方法包括:系统发送待处理任务到队列,调用所述队列上预先注册的通知函数;所述通知函数发送消息到预先设置的网关,唤醒线程;所述线程判断所述队列上的记录值,根据判断结果执行待处理任务。
【技术特征摘要】
1.一种多对象阻塞方法,其特征在于,所述方法包括:系统发送待处理任务到队列,调用所述队列上预先注册的通知函数;所述通知函数发送消息到预先设置的网关,唤醒线程;所述线程判断所述队列上的记录值,根据判断结果执行待处理任务。2.根据权利要求1所述的方法,其特征在于,在所述系统发送待处理任务到队列,调用所述队列上预先注册的通知函数之后,还包括:所述队列将自身的记录值加1,并返回记录值,所述记录值与队列的任务数量对应。3.根据权利要求1所述的方法,其特征在于,在所述通知函数发送消息到预先设置的网关之后包括:所述网关内部计数器的值更改为1。4.根据权利要求1所述的方法,其特征在于,所述线程判断所述队列上记录值,根据判断结果执行待处理任务,具体包括:所述线程调用所述队列上的记录值,若所述记录值不为0,则运行待处理任务;若所述记录值为0,则立即返回,对下一个队列上的记录值进行判断。5.根据权利要求3所述的方法,其特征在于,在所述线程判断所述队列上的记录值,根据判断结果执行待处理任务之后还包括:判断所述线程是否已运行所述队列上的待处理任务,在所述线程已运行所述队列上的待处...
【专利技术属性】
技术研发人员:李意希,
申请(专利权)人:深圳怡化电脑股份有限公司,深圳市怡化时代科技有限公司,深圳市怡化金融智能研究院,
类型:发明
国别省市:广东,44
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。