CN109324916B - 一种任务执行方法和装置 - Google Patents
一种任务执行方法和装置 Download PDFInfo
- Publication number
- CN109324916B CN109324916B CN201810900699.5A CN201810900699A CN109324916B CN 109324916 B CN109324916 B CN 109324916B CN 201810900699 A CN201810900699 A CN 201810900699A CN 109324916 B CN109324916 B CN 109324916B
- Authority
- CN
- China
- Prior art keywords
- function
- thread
- protection
- task
- state
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 36
- 230000006870 function Effects 0.000 claims description 228
- 238000004590 computer program Methods 0.000 claims description 19
- 238000010586 diagram Methods 0.000 description 11
- 230000004048 modification Effects 0.000 description 8
- 238000012986 modification Methods 0.000 description 8
- 230000008569 process Effects 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000007405 data analysis Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 239000000725 suspension Substances 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/0796—Safety measures, i.e. ensuring safe condition in the event of error, e.g. for controlling element
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种任务执行方法,该方法包括:在任务队列函数中增加保护参数;通过保护参数设置第一线程的目标任务的状态,包括保护状态和非保护状态;通过保护线程函数设置第二线程的状态,包括保护状态和非保护状态;创建异步调用参数结构对象;通过任务队列函数将异步调用参数结构对象和异步调用例行程序函数投递到第二线程;通过异步调用例行程序函数判断目标任务以及第二线程是否均为保护状态;若是,则继续执行通过任务队列函数将异步调用参数结构对象和异步调用例行程序函数投递到第二线程;若否,则执行目标任务。可以通过设置目标任务和第二线程的状态,来控制目标任务的执行时机。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种任务执行方法和装置。
背景技术
在windows多线程的程序开发中,由于每个线程的功能不同,经常需要结合多线程进行工作,其中一种多线程合作的方式为将第一线程的目标任务投递到第二线程中执行,目标任务在第二线程中完成后,再将执行结果返回给第一线程。
如果第二线程执行其他任务时,接收到第一线程的目标任务,由于第二线程处于可唤醒状态,第二线程开始执行目标任务,然而,若该目标任务对该其他任务的数据进行修改,则很可能引起程序的崩溃。例如该其他任务为打印数组容器中的全部数据,而目标任务为删除该数组容器中的目标数据,而该目标数据为还未打印的数据,那么,当该其他任务执行到打印该目标数据时,由于该目标数据已被删除,导致程序的崩溃。
发明内容
本发明提供一种任务执行方法和装置,解决了现有技术中,由于目标任务对第二线程中其他任务的数据的修改,可能引起的程序崩溃问题。
第一方面,本发明实施例提供了一种任务执行方法,所述方法包括:
在任务队列函数中增加保护参数;
通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;
通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;
创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;
通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;
若是,则将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
若否,则通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。
可选的,所述通过所述保护参数设第一线程的目标任务的状态,包括:
通过设置所述保护参数为true,将所述任务队列函数的目标任务设置为保护状态;
通过设置所述保护参数为false,将所述任务队列函数的目标任务设置为非保护状态。
可选的,所述通过保护线程函数设置第二线程的状态,包括:
在所述第二线程的第一执行位置,将所述保护线程函数的参数标记为true,表示所述第二线程进入保护状态;
在所述第一执行位置之后的第二执行位置,将所述保护线程函数的参数标记为false,表示所述第二线程解除保护状态,进入非保护状态。
可选的,在所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程之后,所述方法还包括:
通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;
若所述事件对象为有信号,所述任务队列函数执行返回操作;
若所述事件对象为无信号,继续执行所述通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态。
可选的,所述等待函数中表示通知状态的参数设置为已通知状态,以使得所述第一线程处于可唤醒状态。
可选的,所述等待函数包括WaitForSingleObjectEx函数或SleepEx函数。
可选的,通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,包括:
通过所述任务队列函数调用排队函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄,第三个参数设置为所述异步调用参数结构对象。
第二方面,本发明实施例提供了一种任务执行装置,其特征在于,所述装置包括:
增加单元,用于在任务队列函数中增加保护参数;
第一设置单元,用于通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;
第二设置单元,用于通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;
创建单元,用于创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;
投递单元,用于通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
判断单元,用于通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;
等待单元,用于若是,则将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
执行单元,用于若否,则通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。
第三方面,本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述任务执行方法的所有步骤。
第四方面,本发明实施例提供了一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现实现上述任务执行方法的所有步骤。
本发明实施例提供的任务执行方法包括:在任务队列函数中增加保护参数;通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;若是,则将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;若否,则通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。可见,本发明实施例通过设置目标任务和第二线程的状态,来控制目标任务的执行,当二者都处于保护状态时,不能执行目标任务,只有任意一者为非保护状态时,才能执行目标任务,对将第一线程的目标任务投递到第二线程中执行的方法进行了优化,可以避免由于目标任务对第二线程中其他任务的数据的修改,可能引起的程序崩溃问题。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例中任务执行方法的流程图;
图2为本申请实施例中任务执行装置的结构示意图;
图3为本申请实施例中计算机设备的结构示意图;
图4为本申请实施例中计算机可读存储介质的结构示意图。
具体实施方式
本发明实施例提供了一种任务执行方法和装置,通过设置目标任务和第二线程的状态,来控制目标任务的执行,当二者都处于保护状态时,不能执行目标任务,只有任意一者为非保护状态时,才能执行目标任务,对将第一线程的目标任务投递到第二线程中执行的方法进行了优化,可以避免由于目标任务对第二线程中其他任务的数据的修改,可能引起的程序崩溃问题。
本发明实施例中的技术方案,总体思路如下:
在任务队列函数中增加保护参数;通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;若是,则将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;若否,则通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。本发明实施例可以控制目标任务的执行时机,从而避免由于目标任务对第二线程中其他任务的数据的修改,可能引起的程序崩溃问题。
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。再者,本文中使用的变量或者函数名称,在一些其他的实现方式中,也可以采用其他的名称,此处不做限制。
实施例一
本发明实施例一提供一种任务执行方法,请参考图1,所述方法包括:
S101、在任务队列函数中增加保护参数。
在Windows操作系统中,每个线程都有自己的APC(Asynchronous ProcedureCall,异步过程调用)队列,任何其他的线程可以调用排队函数QueueUserAPC将一个任务投递到该线程中。其中,排队函数QueueUserAPC的功能就是把一个APC对象加入到指定线程的APC队列中;若线程处于可唤醒状态,那么该线程就会执行APC队列中的所有任务,在第一线程将目标任务投递到第二线程中执行的方法中,由任务队列函数QueueTaskUntilComplete来实现将第一线程的目标任务投递到第二线程中执行,本实施例在该任务队列函数中增加保护参数,具体的,增加保护参数后的任务队列函数的原型如下:
bool QueueTaskUntilComplete(int targetThreadId,const TaskRunCallback&cb,int block)
该任务队列函数用于把目标任务投递到第二线程中,其中,targetThreadId参数表示第二线程的线程id,cb参数表示第一线程的目标任务,block为新增的保护参数,该保护参数用于设置目标任务cb的状态。
S102、通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态。
具体的,通过设置所述保护参数block为true,将所述任务队列函数的目标任务设置为保护状态;通过设置所述保护参数block为false,将所述任务队列函数的目标任务设置为非保护状态。
S103、通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态。
具体的,在保护线程函数BlockingCurrentThreadApc中,利用了一个线程局部存储变量g_blockingThread来作为BlockingCurrentThreadApc函数的参数。其中,在所述第二线程的第一执行位置,将所述保护线程函数的参数标记为true,表示所述第二线程进入保护状态;在所述第一执行位置之后的第二执行位置,将所述保护线程函数的参数标记为false,表示所述第二线程解除保护状态,进入非保护状态。还需要说明的是,执行位置是指第二线程代码中的某个执行位置,举例来说,第一执行位置可以是第二线程执行的某个任务之前,而第二执行位置可以是该某个任务执行完成后,即可以通过对第二线程的保护,从而对该某个任务进行保护,第一执行位置也可以设置在该某个任务执行过程中的某个步骤之前,则第二执行位置设置在该某个步骤之后,从而对该某个步骤进行保护,在实际实现中,可以根据具体情况进行设置,此处不做限制。
需要说明的是,目标任务和第二线程的状态的设置没有顺序的限制,可以先执行步骤S102,再执行步骤S103,也可以先执行步骤S103,再执行步骤S102,此处不做限制。
S104、创建异步调用参数结构对象。
具体的,可以通过调用new操作符来创建异步调用参数结构对象ApcParameter,所述异步调用参数结构对象ApcParameter包括任务成员cb、事件成员hEvent、保护字段block和结果字段result,其中,将所述目标任务赋值给所述任务成员,通过调用创建事件函数CreateEvent创建一个事件对象,并将该事件对象的初始状态设置为无信号,然后将该预先创造的事件对件赋值给所述事件成员,并将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果。
举个例子,异步调用参数结构对象ApcParameter的具体实现如下:
struct ApcParameter
{TaskRunCallback cb;HANDLE hEvent;int block;ApcExecuteResult result;}
其中,结果字段对应的结构ApcExecuteResult是一个枚举类型的结构,用来表示目标任务的执行结果,具体实现如下:
enum ApcExecuteResult
{None,Complete,Pending};
其中,None表示目标任务的初始状态,还没有执行结果;Complete表示目标任务已执行完成;Pending表示目标任务需要等待执行,现在不能执行目标任务。
S105、通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程。
具体的,通过所述任务队列函数调用排队函数QueueUserAPC将所述异步调用参数结构对象ApcParameter和异步调用例行程序函数ApcRoutine投递到所述第二线程,所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄hThread,第三个参数设置为所述异步调用参数结构对象。其中,当第一线程调用任务队列函数实现将目标任务投递到第二线程中执行的过程中,先通过任务队列函数调用线程打开函数OpenThread,由该函数根据targetThreadId获取第二线程的句柄hThread。举个例子,排队函数具体的实现如下:
QueueUserAPC(ApcRoutine,hThread,apc)
其中,apc表示异步调用参数结构对象ApcParameter。
S106、通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态。
具体的,所述异步调用例行程序函数根据所述保护字段判断所述目标任务是否为保护状态,根据所述保护线程函数的参数判断所述第二线程是否为保护状态,若所述保护字段为true,且所述保护线程函数的参数为true,则确定所述目标任务以及所述第二线程均为保护状态,继续执行步骤S107。若所述保护字段和所述保护线程函数的参数中任一个为false,则确定所述目标任务以及所述第二线程不符合均为保护状态的条件,继续执行步骤S108。
S107、将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程。
若所述目标任务以及所述第二线程均为保护状态,则不执行所述目标任务,从而对第二线程正在进行的其他任务进行保护。并将所述结果字段设置为等待执行,即将所述结果字段设置为Pending。当所述结果字段被设置为等待执行后,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程。
具体的,通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态,若所述事件对象为有信号,所述任务队列函数执行返回操作;若所述事件对象为无信号,继续执行所述通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态。
等待函数包括WaitForSingleObjectEx函数或SleepEx函数。其中,SleepEx函数可以用来中止当前线程运行直到指定的条件被触发;WaitForSingleObject函数可以用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的预置时间内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达预置时间,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
进一步的,等待函数中表示通知状态的参数可以设置为已通知状态,具体的,可以将等待函数的最后一个参数设置为true,以使得第一线程处于可唤醒状态。当第一线程处于可唤醒状态,若其他线程向第一线程投递任务,第一线程仍然可以执行该任务,否则第一线程处于挂起状态,不会执行任何任务。
虽然任务队列函数已执行返回操作,但目标任务未被执行,所以继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,直到目标任务和第二线程中的任一个为非保护状态,从而目标任务将被执行。
S108、通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。
若所述目标任务以及所述第二线程不符合均为保护状态的条件,说明不需要对目标任务的执行进行限制,可以通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,即将所述结果字段设置为Complete。当所述结果字段被设置为完成后,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。任务队列函数执行返回后,结束本次的多线程合作。
其中,通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态,若所述事件对象为有信号,所述任务队列函数执行返回操作;若所述事件对象为无信号,继续执行所述通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态。步骤S107中已对任务队列函数调用等待函数来检测所述事件对象的信号状态的步骤进行了详细的描述,此处不再赘述。
还需要说明的是,所述目标任务和所述第二线程的状态,可以由工作人员根据实际情况进行人工设置,也可以根据数据分析方法,例如关键字的提取和分析,判断目标任务的执行是否会对第二线程正在执行的其他任务产生影响,从而确定所述目标任务和所述第二线程的状态,此处不做限制。
为了便于理解,下面举一个例子对本申请实施例进行说明,并不用于限制本申请:
在第一线程中,通过任务队列函数向第二线程投递了一个目标任务RemoveNumber,并通过将保护参数block设置为true,即将该目标任务设置为保护状态,具体如下:
QueueTaskUntilComplete(threadIdOfA,RemoveNumber,true);
该目标任务为删除g_numbers中的数据10,g_numbers为包括数据1-100的数组,该目标任务具体如下:
void RemoveNumber(){g_numbers.remove(10);}
在第二线程中,正在执行打印g_numbers中全部数据的任务,可见,在该任务执行前的第一执行位置,通过将保护线程函数BlockingCurrentThreadApc的参数设置为true,来将第二线程设置为保护状态,直到该打印任务完成后,第二线程才被解除保护状态,则目标任务在该打印任务执行期间不能被执行,即目标任务不可能被for循环体内的SleepEx(0,TRUE)调用。具体实现如下:
否则,如果没有将目标任务和第二线程设置为保护状态,则目标任务可以在有等待函数的任意位置被调用,假如目标任务在第二个SleepEx(0,TRUE)处被调用,由于SleepEx(0,TRUE)在for循环体内,此时,打印任务很有可能还未完成,那么就有可能在打印数据10之前,目标任务已将数据10删除,从而导致打印任务在执行打印数据10的时候,引起程序的崩溃。可见,对于目标任务和第二线程设置保护状态,可以控制目标任务的执行时机,避免可能导致的程序崩溃问题。
本实施例中,在任务队列函数中增加保护参数;通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;若是,则将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;若否,则通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。可见,本发明实施例通过设置目标任务和第二线程的状态,来控制目标任务的执行时机,当二者都处于保护状态时,不能执行目标任务,只有任意一者为非保护状态时,才能执行目标任务,对将第一线程的目标任务投递到第二线程中执行的方法进行了优化,可以避免由于目标任务对第二线程中其他任务的数据的修改,可能引起的程序崩溃问题。
基于同一发明构思,本发明实施例还提供了与实施例一中方法对应的装置,见实施例二。
实施例二
本发明实施例二提供了一种任务执行装置,请参考图2,所述装置包括:
增加单元201,用于在任务队列函数中增加保护参数;
第一设置单元202,用于通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;
第二设置单元203,用于通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;
创建单元204,用于创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;
投递单元205,用于通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
判断单元206,用于通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;
等待单元207,用于若是,则将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
执行单元208,用于若否,则通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。
本实施例中,通过增加单元201在任务队列函数中增加保护参数;第一设置单元202通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;第二设置单元203通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;创建单元204创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;投递单元205通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;判断单元206通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;若是,等待单元207将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;若否,执行单元208通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作。可见,本发明实施例通过设置目标任务和第二线程的状态,来控制目标任务的执行,当二者都处于保护状态时,不能执行目标任务,只有任意一者为非保护状态时,才能执行目标任务,对将第一线程的目标任务投递到第二线程中执行的方法进行了优化,可以避免由于目标任务对第二线程中其他任务的数据的修改,可能引起的程序崩溃问题。
由于本发明实施例二所介绍的装置,为实施本发明实施例一的任务执行方法所采用的装置,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该装置的具体结构及变形,故而在此不再赘述。凡是本发明实施例一的方法所采用的装置都属于本发明所欲保护的范围。
实施例三
基于同一发明构思,本实施例提供了一种计算机设备300,如图3所示,包括存储器310、处理器320及存储在存储器310上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时,可以实现上述实施例一的所有步骤,故而在此不再赘述。
实施例四
基于同一发明构思,本实施例提供一种计算机可读存储介质400,如图4所示,其上存储有计算机程序411,该计算机程序411被处理器执行时,可以实现上述实例一的所有步骤,故而在此不再赘述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (9)
1.一种任务执行方法,其特征在于,所述方法包括:
在任务队列函数中增加保护参数;
通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;
通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;
创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;
通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;
若是,则将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
若否,则通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作;
所述通过所述保护参数设第一线程的目标任务的状态,包括:
通过设置所述保护参数为true,将所述任务队列函数的目标任务设置为保护状态;
通过设置所述保护参数为false,将所述任务队列函数的目标任务设置为非保护状态。
2.根据权利要求1所述的方法,其特征在于,所述通过保护线程函数设置第二线程的状态,包括:
在所述第二线程的第一执行位置,将所述保护线程函数的参数标记为true,表示所述第二线程进入保护状态;
在所述第一执行位置之后的第二执行位置,将所述保护线程函数的参数标记为false,表示所述第二线程解除保护状态,进入非保护状态。
3.根据权利要求1所述的方法,其特征在于,在所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程之后,所述方法还包括:
通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;
若所述事件对象为有信号,所述任务队列函数执行返回操作;
若所述事件对象为无信号,继续执行所述通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态。
4.根据权利要求3所述的方法,其特征在于,所述等待函数中表示通知状态的参数设置为已通知状态,以使得所述第一线程处于可唤醒状态。
5.根据权利要求4所述的方法,其特征在于,所述等待函数包括WaitForSingleObjectEx函数或SleepEx函数。
6.根据权利要求1-5任一项所述的方法,其特征在于,所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,包括:
通过所述任务队列函数调用排队函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄,第三个参数设置为所述异步调用参数结构对象。
7.一种任务执行装置,其特征在于,所述装置包括:
增加单元,用于在任务队列函数中增加保护参数;
第一设置单元,用于通过所述保护参数设置第一线程的目标任务的状态,所述目标任务的状态包括保护状态和非保护状态;
第二设置单元,用于通过保护线程函数设置第二线程的状态,所述第二线程的状态包括保护状态和非保护状态;
创建单元,用于创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员、事件成员、保护字段和结果字段,其中,将所述目标任务赋值给所述任务成员,将预先创建的初始状态为无信号的事件对象赋值给所述事件成员,将所述保护参数赋值给所述保护字段,所述结果字段用于记录所述目标任务的执行结果;
投递单元,用于通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
判断单元,用于通过所述异步调用例行程序函数判断所述目标任务以及所述第二线程是否均为保护状态;
等待单元,用于若是,则将所述结果字段设置为等待执行,通过所述异步调用例行程序函数将所述事件成员设置为有信号,并继续执行所述通过所述任务队列函数将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程;
执行单元,用于若否,则通过所述异步调用例行程序函数在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后将所述结果字段设置为完成,通过所述异步调用例行程序函数将所述事件成员设置为有信号,以使得所述任务队列函数执行返回操作;
所述第一设置单元还用于:
通过设置所述保护参数为true,将所述任务队列函数的目标任务设置为保护状态;
通过设置所述保护参数为false,将所述任务队列函数的目标任务设置为非保护状态。
8.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-6中任一项所述的方法。
9.一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1-6中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810900699.5A CN109324916B (zh) | 2018-08-09 | 2018-08-09 | 一种任务执行方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810900699.5A CN109324916B (zh) | 2018-08-09 | 2018-08-09 | 一种任务执行方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109324916A CN109324916A (zh) | 2019-02-12 |
CN109324916B true CN109324916B (zh) | 2022-02-08 |
Family
ID=65264012
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810900699.5A Active CN109324916B (zh) | 2018-08-09 | 2018-08-09 | 一种任务执行方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109324916B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115037606B (zh) * | 2022-06-17 | 2023-04-28 | 福建天泉教育科技有限公司 | 一种网络数据的获取方法及终端 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1677353A (zh) * | 2004-03-24 | 2005-10-05 | 微软公司 | 用于检测多线程程序中潜在竞争的方法和系统 |
CN101266561A (zh) * | 2008-04-29 | 2008-09-17 | 中兴通讯股份有限公司 | 一种在多核多线程处理器中的核间消息通信方法 |
CN102567111A (zh) * | 2011-12-23 | 2012-07-11 | 深圳市融创天下科技股份有限公司 | 一种异步过程调用的方法、系统和终端设备 |
US9250979B2 (en) * | 2011-06-27 | 2016-02-02 | International Business Machines Corporation | Asynchronous grace-period primitives for user-space applications |
CN106681811A (zh) * | 2016-12-08 | 2017-05-17 | 腾讯科技(深圳)有限公司 | 基于线程池的多线程调度方法及装置 |
-
2018
- 2018-08-09 CN CN201810900699.5A patent/CN109324916B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1677353A (zh) * | 2004-03-24 | 2005-10-05 | 微软公司 | 用于检测多线程程序中潜在竞争的方法和系统 |
CN101266561A (zh) * | 2008-04-29 | 2008-09-17 | 中兴通讯股份有限公司 | 一种在多核多线程处理器中的核间消息通信方法 |
US9250979B2 (en) * | 2011-06-27 | 2016-02-02 | International Business Machines Corporation | Asynchronous grace-period primitives for user-space applications |
CN102567111A (zh) * | 2011-12-23 | 2012-07-11 | 深圳市融创天下科技股份有限公司 | 一种异步过程调用的方法、系统和终端设备 |
CN106681811A (zh) * | 2016-12-08 | 2017-05-17 | 腾讯科技(深圳)有限公司 | 基于线程池的多线程调度方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109324916A (zh) | 2019-02-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4709469B2 (ja) | スレッドを明示的に中断することなく整合状態とする方法及び装置 | |
US6698016B1 (en) | Method for injecting code into another process | |
CN107704314B (zh) | 用于迁移虚拟机的方法和装置 | |
US9128615B2 (en) | Storage systems that create snapshot queues | |
CN109240811B (zh) | 一种任务执行方法和装置 | |
CN113010275A (zh) | 一种中断处理方法和装置 | |
CN109324916B (zh) | 一种任务执行方法和装置 | |
CN113126924A (zh) | 一种数据迁移方法、装置、设备及计算机可读存储介质 | |
EP3128458B1 (en) | User-mode component injection and atomic hooking | |
CN110688203B (zh) | 一种任务执行方法和装置 | |
EP3223185B1 (en) | System and method dynamic code patching techniques from user-mode process address space | |
KR20110057297A (ko) | 악성 봇 동적 분석 시스템 및 방법 | |
CN114564720A (zh) | 程序文件审核方法、装置、电子设备及存储介质 | |
JP2006331213A (ja) | システムリソース管理装置、システムリソース管理方法及びプログラム | |
JP7298694B2 (ja) | 異常検出装置、制御方法、及びプログラム | |
CN110968486A (zh) | 一种脚本运行方法及装置 | |
JP5997005B2 (ja) | 情報処理装置、プロセスの正常終了判定方法およびプログラム | |
JPH03260838A (ja) | Cpu使用時間制限方式 | |
CN108459847B (zh) | 对象的调用方法、装置及终端设备 | |
CN110688352B (zh) | 一种文件删除方法、装置和计算机可读存储介质 | |
CN107690625B (zh) | iOS线程恢复的方法及装置 | |
JPH0766331B2 (ja) | プログラム出口の動的非アクティブ化方法および装置 | |
CN114168944A (zh) | 一种处理读写操作的方法和系统 | |
US20070226737A1 (en) | Methods, systems, and storage mediums for monitoring and controlling command usage | |
US9195498B2 (en) | Supply capability engine weekly poller |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20240103 Address after: Building 1, 5th Floor, No. 21 Shenzhen Road, Laoshan District, Qingdao City, Shandong Province, 266100 Patentee after: Qingdao Xiyuan Consulting Co.,Ltd. Address before: 430000 East Lake Development Zone, Wuhan City, Hubei Province, No. 1 Software Park East Road 4.1 Phase B1 Building 11 Building Patentee before: WUHAN DOUYU NETWORK TECHNOLOGY Co.,Ltd. |