一种协程的同步方法、系统、装置及存储介质

文档序号:32842709发布日期:2023-01-06 21:23阅读:25来源:国知局
一种协程的同步方法、系统、装置及存储介质

1.本发明涉及通信技术领域,尤其是一种协程的同步方法、系统、装置及存储介质。


背景技术:

2.现有的协程同步机制主要实现了“主动放弃执行权”(yield)和“继续执行”(resume)的同步操作。“主动放弃执行权”的操作通过切换不同的协程上下文,实现将执行权限从放弃执行的协程中主动跳转到目标协程中,以执行目标协程;而“继续执行”的操作则是将执行权限返回到主动放弃执行权的协程的中断处,继续执行。然而,这种单一的、协作式的同步操作无法适应复杂的协程同步要求。
3.综上,相关技术存在的问题亟需得到解决。


技术实现要素:

4.本发明的目的在于至少一定程度上解决现有技术中存在的技术问题之一。
5.为此,本发明实施例的一个目的在于提供一种协程的同步方法、系统、装置和介质,其能够降低协程同步控制的复杂度和维护难度,方便协程应用程序的使用。
6.为了达到上述技术目的,本发明实施例所采取的技术方案包括:
7.一方面,本发明实施例提供了一种协程的同步方法,包括以下步骤:
8.建立宿主线程的协程池;
9.在所述协程池中每个协程的栈空间内设置任务调度函数;
10.通过所述任务调度函数执行所述宿主线程内的协程任务;
11.通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作。
12.进一步地,所述在所述协程池中每个协程的栈空间内设置任务调度函数这一步骤,包括:
13.为所述协程池中每个协程设置所述栈空间;
14.在所述栈空间中设置所述任务调度函数的返回地址,并指定协程上下文,所述协程上下文用于保存协程的栈顶地址、栈底地址、栈空间大小、协程上下文状态、处理任务函数的地址。
15.进一步地,所述通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作,包括:
16.所述协程同步操作模块通过放弃执行操作对所述任务调度函数同步操作;
17.所述放弃执行操作包括;
18.设置唤醒时间;
19.停止运行当前协程;
20.确定所述协程池中包括目标协程,则调度所述目标协程。
21.进一步地,所述通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作,包括:
22.所述协程同步操作模块通过互斥锁操作对所述任务调度函数同步操作;
23.所述互斥锁操作包括;
24.发送互斥锁获取请求;
25.判断所述互斥锁是否获取成功,若是,则保存当前的协程上下文,若否,则停止运行当前协程。
26.进一步地,所述通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作,包括:
27.所述协程同步操作模块通过睡眠操作对所述任务调度函数同步操作;
28.所述睡眠操作包括;
29.设置睡眠时间;
30.根据所述睡眠时间,确定唤醒时间;
31.确定系统当前时间未到达唤醒时间,则当前协程无法被调度。
32.进一步地,所述通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作,包括:
33.所述协程同步操作模块通过阻塞操作对所述任务调度函数同步操作;
34.所述阻塞操作包括;
35.停止运行当前协程。
36.进一步地,所述通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作,包括:
37.所述协程同步操作模块通过执行等待操作对所述任务调度函数同步操作;
38.所述执行等待操作包括;
39.确定被等待协程运行完成,则运行目标协程。
40.另一方面,本发明实施例提出了一种协程的同步系统,包括:
41.第一模块,用于建立宿主线程的协程池;
42.第二模块,用于在所述协程池中每个协程的栈空间内设置任务调度函数;
43.第三模块,用于通过所述任务调度函数执行所述宿主线程内的协程任务;
44.第四模块,用于通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作。
45.另一方面,本发明实施例提供了一种协程的同步装置,包括:
46.至少一个处理器;
47.至少一个存储器,用于存储至少一个程序;
48.当所述至少一个程序被所述至少一个处理器执行时,使得所述至少一个处理器实现所述的协程的同步方法。
49.另一方面,本发明实施例提供了一种存储介质,其中存储有处理器可执行的指令,所述处理器可执行的指令在由处理器执行时用于实现所述的协程的同步方法。
50.本发明公开了一种协程的同步方法,具备如下有益效果:
51.本实施例通过建立宿主线程的协程池;在所述协程池中每个协程的栈空间内设置任务调度函数;通过所述任务调度函数执行所述宿主线程内的协程任务;通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作。这种方法提供了各种同步操作(如
互斥锁(mutex)、条件变量(condition)、睡眠(sleep)、执行等待(join)),协程应用程序只需要执行相关的同步操作,就能够实现复杂的同步流程,降低协程同步控制的复杂度和维护难度,方便协程应用程序的使用。
附图说明
52.为了更清楚地说明本发明实施例或者现有技术中的技术方案,下面对本发明实施例或者现有技术中的相关技术方案附图作以下介绍,应当理解的是,下面介绍中的附图仅仅为了方便清晰表述本发明的技术方案中的部分实施例,对于本领域的技术人员来说,在无需付出创造性劳动的前提下,还可以根据这些附图获取到其他附图。
53.图1为本发明实施例提供的一种协程的同步方法的实施环境示意图;
54.图2为本发明实施例提供的一种协程的同步方法的流程示意图;
55.图3为本发明实施例提供的一种协程的同步系统的结构示意图;
56.图4为本发明实施例提供的一种协程的同步装置的结构示意图。
具体实施方式
57.本部分将详细描述本发明的具体实施例,本发明之较佳实施例在附图中示出,附图的作用在于用图形补充说明书文字部分的描述,使人能够直观地、形象地理解本发明的每个技术特征和整体技术方案,但其不能理解为对本发明保护范围的限制。
58.在本发明实施例的描述中,若干的含义是一个或者多个,多个的含义是两个以上,大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数,“至少一个”是指一个或者多个,“以下至少一项”及其类似表达,是指的这些项中的任意组合,包括单项或复数项的任意组合。如果有描述到“第一”、“第二”等只是用于区分技术特征为目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系。
59.需要说明的是,本发明实施例中设置、安装、连接等词语应做广义理解,所属技术领域技术人员可以结合技术方案的具体内容合理确定上述词语在本发明实施例中的具体含义。例如,术语“连接”可以是机械连接,也可以是电连接或可以相互通讯;可以是直接相连,也可以通过中间媒介间接相连。
60.在本发明实施例的描述中,参考术语“一个实施例/实施方式”、“另一实施例/实施方式”或“某些实施例/实施方式”、“在上述实施例/实施方式”等的描述意指结合实施方式或示例描述的具体特征、结构、材料或者特点包含于本公开的至少两个实施例或实施方式中。在本公开中,对上述术语的示意性表述不一定指的是相同的示实施例或实施方式。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或实施方式中以合适的方式结合。
61.需要说明的是,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
62.在使用协程完成某个复杂任务时,往往需要多个协程相互配合,按照预定的次序交叉执行。也就是说,协程之间存在着相互依赖关系,一个协程的执行依赖于另一个协程的结果。当依赖关系不满足时,协程放弃执行,使得其它协程能够运行,直到条件满足时,再恢
复执行。这种协程之间相互配合、相互依赖的关系也称为协程的同步。协程同步控制需要协程调度的支持。一般而言,协程的调度是协作式的,即当协程被调度执行后,就会一直执行,直到结束,除非协程自身主动放弃执行权。协程主动放弃执行权的操作使得同内核线程中的其它协程可以运行。
63.现有的协程同步机制主要实现了“主动放弃执行权”(yield)和“继续执行”(resume)的同步操作。“主动放弃执行权”的操作通过切换不同的协程上下文,实现执行权限从放弃执行的协程中主动跳转到目标协程中,执行目标协程;“继续执行”的操作则返回到主动放弃执行权的协程的中断处,继续执行。然而,这种单一的、协作式的同步操作无法适应复杂的协程同步要求。
64.虽然操作系统提供了一套内核线程的同步操作,例如posix标准就提供了互斥锁(mutex)、条件变量(condition)、睡眠(sleep)、执行等待(join)等同步操作。但是,协程的同步操作不能使用操作系统提供的同步操作,这是由协程是纯用户态线程的本质所决定的。
65.为此,本技术提出了一种协程的同步方法及系统、装置及存储介质,通过建立宿主线程的协程池;在所述协程池中每个协程的栈空间内设置任务调度函数;通过所述任务调度函数执行所述宿主线程内的协程任务;通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作。这种方法提供了各种同步操作(如互斥锁(mutex)、条件变量(condition)、睡眠(sleep)、执行等待(join)),协程应用程序只需要执行相关的同步操作,就能够实现复杂的同步流程,降低协程同步控制的复杂度和维护难度,方便协程应用程序的使用。
66.参照图1,图1是本技术实施例中,提供了一种协程运行环境的设置方法的实施环境示意图,该实施环境的软硬件主体主要包括协程任务调度模块101和协程同步操作模块102。
67.协程任务调度模块,提供协程的调度和同步的管理机制,提供了多核处理器架构上对不同状态的协程上下文实施调度和同步的功能,为协程执行同步操作提供运行和调度支持。协程任务调度模块定义了四种协程上下文状态:第一种是“占用状态”,第二种是“空闲状态”,第三种是“睡眠状态”,第四种是“阻塞状态”。协程在执行同步操作时,其上下文状态将在这四种状态之间进行转换。
[0068]“占用状态”的协程上下文是指该协程上下文已经分配给了某个处理任务,协程任务调度函数能够调度执行该处理任务;“空闲状态”的协程上下文是指该协程上下文还处于初始化状态,未分配给某个处理任务;“睡眠状态”的协程上下文是指该协程上下文已经分配给了某个处理任务,但是处理任务处于睡眠状态,该协程上下文在睡眠到期后,能够被协程任务调度函数调度,或者在睡眠期间被其它协程唤醒;“阻塞状态”的协程上下文是指该协程上下文已经分配给了某个处理任务,但是处理任务处于阻塞状态,该协程上下文不能够被协程任务调度函数调度,直至该协程上下文被其它协程唤醒。
[0069]
协程同步操作模块,提供协程同步控制的操作流程,提供类似于posix规范的同步接口语义。协程同步操作模块定义了六种同步操作,分别是:“放弃执行”操作(yield)、“互斥锁”操作(mutex)、“条件变量”操作(condition)、“睡眠”操作(sleep)、“阻塞”操作(block)、以及“执行等待”操作(join)。
[0070]“放弃执行”操作:通过切换不同的协程上下文,实现执行权限的转移,从当前的协程上下文主动跳转到目标协程上下文中。当前的协程上下文状态转换为“阻塞状态”。
[0071]“互斥锁”操作:当前协程申请一个互斥锁,直至成功获取。在没有成功获取到互斥锁时,当前的协程上下文状态转换为“阻塞状态”。
[0072]“条件变量”操作:提供当前协程的等待操作,以及唤醒“阻塞状态”的协程上下文或者“睡眠状态”的协程上下文的操作。在执行等待操作时,当前的协程上下文状态转换为“阻塞状态”;在执行唤醒操作时,被唤醒的协程上下文状态转换为“占用状态”。
[0073]“睡眠”操作:提供当前协程睡眠一段时间后被唤醒的操作。当前的协程上下文状态转换为“睡眠状态”,在被唤醒时,其状态转换为“占用状态”。
[0074]“阻塞”操作:当前协程无条件暂停执行,直至被唤醒。当前的协程上下文状态转换为“阻塞状态”,直至被唤醒。
[0075]“执行等待”操作:当前协程等待另一个协程执行完毕,才被唤醒。当前协程上下文状态转换为“阻塞状态”。
[0076]
图2是本技术实施例提供的一种协程的同步方法的流程图,图2中以一种协程的同步方法配置于如图1所示的实施环境中执行为例进行说明。参照图2,该协程的同步方法包括但不限于步骤s110至步骤s130。
[0077]
s110、建立宿主线程的协程池。
[0078]
本步骤中,需要建立宿主线程的协程池。为了让协程应用程序能够以协程的方式进行运行,需要对协程环境进行初始化,即按照协程应用程序指定的逻辑核心数量,创建对应数量的宿主线程,每个宿主线程向服务进程申请一个逻辑核心,获取到核心之后,在每个核心上创建协程池,在每个协程池中创建指定个数的协程及上下文,初始化每个协程的栈空间(每个协程的栈空间中需要保留一些空间进行寄存器的保存),最后在栈空间中设置返回地址。
[0079]
s120、在所述协程池中每个协程的栈空间内设置任务调度函数。
[0080]
本步骤中,将定义的处理任务函数以协程的方式注册到协程运行环境中。具体地,协程应用程序根据服务需求定义业务所需的处理任务函数,将定义的处理任务函数以协程的方式注册到协程运行管理环境中,透明地为处理任务提供协程运行模型和运行环境。
[0081]
其中,任务调度函数的运行流程包括以下步骤:
[0082]
遍历协程池,以round robin方式查找处于“占用状态”或者“睡眠状态”的协程上下文,并且该协程上下文中的唤醒时间小于系统的当前时间,将其作为目标协程上下文,从而选出可以被唤醒而进行调度的协程上下文,包括处于“睡眠状态”且睡眠时间到期的协程上下文,以及处于“占用状态”而被立即执行的协程上下文。
[0083]
判断选中的协程上下文是否就是当前的协程上下文。如果选中的协程上下文不是当前的协程上下文,则执行一次从当前协程上下文到目标协程上下文的切换。如果是,则将协程上下文的状态设置为“阻塞状态”,并判断处理任务函数是否执行了同步操作,如果没有,协程任务调度函数在该协程的上下文中获取处理任务函数的地址及其参数,并且执行该处理任务函数,直至执行完毕,协程任务调度函数更新该协程上下文的状态为“空闲状态”,该协程上下文可重新分配给新的处理任务函数。
[0084]
如果处理任务函数执行过同步操作,就直接返回到执行同步操作而中断的位置继
续执行。
[0085]
执行一次“唤醒所有等待条件的协程”操作。
[0086]
判断协程池中所有的协程上下文是否都为“空闲状态”,如果不是,则循环遍历协程池,选择下一个目标协程。
[0087]
当没有处理任务函数执行时,即协程池中所有协程上下文的状态均为“空闲状态”,则协程任务调度函数在当前协程的栈空间上执行一次上下文环境的切换,返回到宿主线程的栈空间中,又重新跳转回宿主线程,宿主线程继续运行,直到宿主线程结束运行。
[0088]
s130、通过所述任务调度函数执行所述宿主线程内的协程任务。
[0089]
在宿主线程成功获得托管核心之后,任务调度函数在协程栈空间中运行,调度执行本协程池中所有的协程任务,协程任务调度的过程就是选择目标协程、执行一次从当前协程上下文环境到目标协程上下文环境的切换、以及在目标协程的栈空间中执行协程任务的过程。
[0090]
s140、通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作。
[0091]
协程同步操作模块包含了六种同步操作,分别是:“放弃执行”操作、“互斥锁”操作、“条件变量”操作、“睡眠”操作、“阻塞”操作、以及“执行等待”操作。处理任务函数可以执行这些同步操作进行不同的处理任务之间的同步控制,多个处理任务共同完成复杂的服务处理任务。
[0092]
进一步作为可选的实施方式,所述在所述协程池中每个协程的栈空间内设置任务调度函数这一步骤,包括:
[0093]
为所述协程池中每个协程设置所述栈空间;
[0094]
在所述栈空间中设置所述任务调度函数的返回地址,并指定协程上下文,所述协程上下文用于保存协程的栈顶地址、栈底地址、栈空间大小、协程上下文状态、处理任务函数的地址。
[0095]
具体地,协程任务调度模块为首次运行的宿主线程建立协程池,为协程池中的每个协程分配栈空间,协程的编号从0号开始,依次加1,在每个协程的栈空间的返回地址处,设置协程任务调度函数的地址,并且指定协程上下文,协程上下文用来保存协程的栈顶地址、栈底地址、栈空间大小、协程上下文状态、处理任务函数的地址和参数地址、以及唤醒时间,然后将协程上下文的状态初始化为“空闲状态”。当发生协程上下文切换时,执行流程能够通过返回地址进入到协程任务调度函数中,由协程任务调度函数调度执行协程池中所有协程。并且,协程任务调度模块在每个协程上下文中指定一个条件变量,用于进行阻塞和唤醒的同步控制。
[0096]
进一步作为可选的实施方式,所述通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作,包括:
[0097]
所述协程同步操作模块通过放弃执行操作对所述任务调度函数同步操作;
[0098]
具体地,放弃执行操作是指将主动放弃执行当前的协程,将当前协程推后到下一个调度机会执行,为协程主动放弃当前执行权提供同步机制。
[0099]
所述放弃执行操作包括;
[0100]
设置唤醒时间;
[0101]
停止运行当前协程;
[0102]
确定所述协程池中包括目标协程,则调度所述目标协程。
[0103]
放弃执行操作的流程包括以下步骤:
[0104]
将当前的协程上下文的唤醒时间设置为0,表明该协程可以被立即调度。
[0105]
执行一次协程任务调度函数,放弃当前协程的执行,调度其它的协程上下文。遍历协程池,以round robin方式查找处于“占用状态”或者“睡眠状态”的协程上下文,并且该协程上下文中的唤醒时间小于系统的当前时间,将其作为目标协程上下文。
[0106]
判断协程池中是否有合适的协程上下文可供选择,如果没有,则本协程上下文在调度过程中则会再次被选中,其上下文状态被设置为“阻塞状态”,然后从协程任务调度函数返回,继续执行由于执行“放弃执行”操作而中断的代码。
[0107]
如果协程池中有合适的协程上下文可供选择,则协程任务调度函数切换到目标协程上下文中,并且将当前的协程上下文状态设置为“阻塞状态”,然后在目标协程上下文中执行处理任务函数,直至协程池中所有的协程上下文都被执行完成,最后从协程任务调度函数返回,继续执行由于执行“放弃执行”操作而中断的代码。
[0108]
进一步作为可选的实施方式,所述通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作,包括:
[0109]
所述协程同步操作模块通过互斥锁操作对所述任务调度函数同步操作;
[0110]
所述互斥锁操作包括;
[0111]
发送互斥锁获取请求;
[0112]
判断所述互斥锁是否获取成功,若是,则保存当前的协程上下文,若否,则停止运行当前协程。
[0113]“互斥锁”操作的流程包括以下步骤:
[0114]
协程需要对一个共享区(临界区)数据进行互斥访问时,先对该共享数据进行“获取互斥锁”操作。
[0115]
获取互斥锁操作先定义一个原子布尔变量,初始化为false。false表示获取锁不成功,true则表示获取锁成功。
[0116]
通过处理器提供的原子“比较交换”操作(cas操作)和内存屏障指令,“获取互斥锁”操作循环执行该布尔变量和true的比较,如果为true,表明获取锁成功,则保存当前的协程上下文,退出循环,协程开始对共享区(临界区)数据进行互斥的访问。
[0117]
如果比较结果为false,表明还没有成功获取锁,则执行一次“放弃执行”操作,将主动放弃执行当前的协程,将当前协程推后到下一个调度机会执行,为协程主动放弃当前执行权提供同步机制。等待被再次调度,循环执行,直至获取互斥锁成功。
[0118]
当共享数据访问完成后,协程执行“释放互斥锁”操作,通过处理器提供的原子“内存存储”操作(store操作)和内存屏障指令,将该布尔变量重新设置为false。
[0119]
进一步作为可选的实施方式,所述通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作,包括:
[0120]
所述协程同步操作模块通过睡眠操作对所述任务调度函数同步操作;
[0121]
所述睡眠操作包括;
[0122]
设置睡眠时间;
[0123]
根据所述睡眠时间,确定唤醒时间;
操作。
[0143]
进一步作为可选的实施方式,协程同步操作模块还包括条件变量操作,条件变量操作包括等待直至条件成立操作、等待直至条件超时操作、唤醒一个等待条件的协程操作、以及唤醒所有等待条件的协程操作,为协程等待某些条件提供同步机制。条件变量操作定义一个等待协程队列,并且初始化为空,用来进行等待和唤醒操作的同步控制。
[0144]
协程执行等待直至条件成立操作的流程包括以下步骤:
[0145]
协程首先获取一个互斥锁。
[0146]
协程执行等待直至条件成立操作,该操作将当前协程加入到等待协程队列中,然后释放获取到的互斥锁。
[0147]
执行一次协程任务调度函数,放弃当前协程的执行。协程任务调度函数遍历协程池,以round robin方式查找处于“占用状态”或者“睡眠状态”的协程上下文,并且该协程上下文中的唤醒时间小于系统的当前时间,将其作为目标协程上下文,当前协程的状态则由协程任务调度函数设置为“阻塞状态”,等待其它协程将其唤醒。每次当有协程执行完毕时,协程任务调度函数都会执行唤醒所有等待条件的协程的操作,将其唤醒。或者有协程主动执行一次“唤醒所有等待条件的协程”的操作,将其唤醒。
[0148]
该协程被唤醒后,从协程任务调度函数返回,再次获取一个互斥锁,之后继续执行。
[0149]
协程执行等待直至条件超时操作的流程包括以下步骤:
[0150]
协程首先获取一个互斥锁。
[0151]
协程执行等待直至条件超时操作,该操作设置一个超时时长,作为该协程上下文的唤醒时间。
[0152]
该操作将当前协程加入到等待协程队列中,然后释放获取到的互斥锁。
[0153]
该操作执行一次协程任务调度函数,放弃当前协程的执行。协程任务调度函数遍历协程池,以round robin方式查找处于“占用状态”或者“睡眠状态”的协程上下文,并且该协程上下文中的唤醒时间小于系统的当前时间,将其作为目标协程上下文,当前协程的状态则由协程任务调度函数设置为“阻塞状态”。每次当有协程执行完毕时,协程任务调度函数都会执行“唤醒所有等待条件的协程”的操作,将其唤醒;或者有协程主动执行一次“唤醒所有等待条件的协程”的操作,将其唤醒;又或者超时到期后,由协程任务调度函数将其重新选中而唤醒。
[0154]
该协程被唤醒后,从协程任务调度函数返回,再次获取一个互斥锁。
[0155]
协程执行唤醒一个等待条件的协程操作的流程包括以下步骤:
[0156]
协程首先获取一个互斥锁。
[0157]
判断等待协程队列是否为空,如果为空,表明没有协程需要被唤醒,则释放获取到的互斥锁,然后返回。
[0158]
如果队列不为空,则选择队列头的协程作为唤醒的对象,并且将该协程从等待协程队列中删除。
[0159]
判断该协程上下文的状态是否为“阻塞状态”,如果是,则将其唤醒时间设置为0,表明可以立即被调度执行,释放获取到的互斥锁,然后返回。
[0160]
如果不是“阻塞状态”,则判断其是否处于“睡眠状态”,如果是,则将其唤醒时间设
置为0,表明可以立即被调度执行,释放获取到的互斥锁,然后返回。
[0161]“唤醒所有等待条件的协程”操作的流程则对“等待协程队列”循环执行“唤醒一个等待条件的协程”操作,直至“等待协程队列”变为空。
[0162]
下面对本发明实施例的全过程进行描述:
[0163]
协程任务调度模块为首次运行的宿主线程建立协程池,为协程池中的每个协程分配栈空间,协程的编号从0号开始,依次加1,在每个协程的栈空间的返回地址处,设置协程任务调度函数的地址,并且指定协程上下文,协程上下文用来保存协程的栈顶地址、栈底地址、栈空间大小、协程上下文状态、处理任务函数的地址和参数地址、以及唤醒时间,然后将协程上下文的状态初始化为“空闲状态”。当发生协程上下文切换时,执行流程能够通过返回地址进入到协程任务调度函数中,由协程任务调度函数调度执行协程池中所有协程。
[0164]
协程任务调度模块在每个协程上下文中指定一个条件变量(并入上面写从权),用于进行阻塞和唤醒的同步控制。
[0165]
宿主线程主动执行一次协程上下文切换,从当前宿主线程上下文切换到本宿主线程的协程池中的0号协程上下文,跳转到0号协程的栈空间中,通过其保存的返回地址(即协程任务调度函数的地址,步骤s1设置),在协程上下文切换完成并返回时,跳转到协程任务调度函数的入口地址,执行协程任务调度函数。
[0166]
协程任务调度函数运行,根据协程上下文的不同的状态,在本协程池中选择目标协程上下文,并且进行协程上下文切换,跳转到目标协程的栈空间中,执行该协程的处理任务函数,直至协程池中所有的协程被执行完毕,进入步骤s6。
[0167]
协程同步操作模块包含了六种同步操作,分别是:“放弃执行”操作、“互斥锁”操作、“条件变量”操作、“睡眠”操作、“阻塞”操作、以及“执行等待”操作。处理任务函数可以执行这些同步操作进行不同的处理任务之间的同步控制,多个处理任务共同完成复杂的服务处理任务。
[0168]
当宿主线程没有需要执行的协程任务(所有的协程任务执行完毕,或者还没有定义协程任务),协程任务调度函数就会执行一次协程上下文环境的切换,返回到宿主线程的栈空间中,控制权又交回给宿主线程。宿主线程再次进入步骤s3,循环运行,直到宿主线程结束运行。
[0169]
宿主线程结束运行时,将释放初始化的协程池资源,包括所有的协程上下文和协程栈空间,宿主线程结束运行,协程任务调度模块结束运行。
[0170]
参照图3,本发明实施例提出的一种协程的同步系统,包括:
[0171]
第一模块301,用于建立宿主线程的协程池;
[0172]
第二模块302,用于在所述协程池中每个协程的栈空间内设置任务调度函数;
[0173]
第三模块303,用于通过所述任务调度函数执行所述宿主线程内的协程任务;
[0174]
第四模块304,用于通过协程同步操作模块对协程池内的所有任务调度函数进行同步操作。
[0175]
上述方法实施例中的内容均适用于本系统实施例中,本系统实施例所具体实现的功能与上述方法实施例相同,并且达到的有益效果与上述方法实施例所达到的有益效果也相同。
[0176]
参照图4,本发明实施例提供了一种协程的同步装置,包括:
[0177]
至少一个处理器401;
[0178]
至少一个存储器402,用于存储至少一个程序;
[0179]
当所述至少一个程序被所述至少一个处理器301执行时,使得所述至少一个处理器401实现图2所示的协程的同步方法。
[0180]
上述方法实施例中的内容均适用于本装置实施例中,本装置实施例所具体实现的功能与上述方法实施例相同,并且达到的有益效果与上述方法实施例所达到的有益效果也相同。
[0181]
本发明实施例还提供了一种存储介质,其中存储有处理器可执行的指令,所述处理器可执行的指令在由处理器执行时用于实现图2所示协程的同步方法。
[0182]
可以理解的是,与现有技术相比,本发明实施例还具有以下优点:
[0183]
本发明提供一种能够适用于复杂同步要求的协程同步方法,有效融合协程的调度机制,提供类似于posix标准的同步操作,提供放弃执行(yield)、互斥锁(mutex)、条件变量(condition)、睡眠(sleep)、阻塞(block)、执行等待(join)操作,协程应用程序只需要执行相关的同步操作,就能够实现复杂的协程同步流程,降低协程同步控制的复杂度和维护难度,方便协程应用程序的使用。
[0184]
以上是对本发明的较佳实施进行了具体说明,但本发明并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做作出种种的等同变形或替换,这些等同的变形或替换均包含在本技术权利要求所限定的范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1