基于Golang语言的多协程同步屏障方法、装置制造方法及图纸

技术编号:30780645 阅读:17 留言:0更新日期:2021-11-16 07:41
本发明专利技术公开了一种基于Golang语言的多协程同步屏障方法、装置,所述方法包括:对同步屏障结构体进行初始化;所述同步屏障结构体包括第一管道和第二管道;其中,同步屏障结构体执行同步屏障的过程包括:前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。采用上述技术方案,达到多协程共同阻塞和同步唤醒,实现简单、便捷且高效率的协程同步。协程同步。协程同步。

【技术实现步骤摘要】
基于Golang语言的多协程同步屏障方法、装置


[0001]本专利技术涉及并行计算
,尤其涉及一种基于Golang语言的多协程同步屏障方法、装置。

技术介绍

[0002]同步屏障(Barrier)是并行计算中的一种同步方法,对于一群进程或线程,程序中的一个同步屏障意味着任何线程/进程执行到此后必须等待,直到所有线程/进程都到达此点才可继续执行下文。
[0003]在其他多种计算机语言中,均有较为常用或较为成熟的同步屏障实现方法,但在Golang语言中,还没有较为简单、便捷且高效率的同步屏障实现方案。

技术实现思路

[0004]专利技术目的:本专利技术提供一种基于Golang语言的多协程同步屏障方法、装置,旨在实现简单、便捷且高效率的同步方法。
[0005]技术方案:本专利技术提供一种基于Golang语言的多协程同步屏障方法,包括:
[0006]对同步屏障结构体进行初始化;所述同步屏障结构体包括第一管道和第二管道;
[0007]其中,同步屏障结构体执行同步屏障的过程包括:
[0008]前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;
[0009]后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;
[0010]后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。
[0011]具体的,其中,每个协程运行时,选择器读取第一管道,如第一管道中有数据存在,则当前协程数量加一,并判断当前协程数量是否达到协程总数;在当前协程数量达到协程总数时,关闭第二管道。
[0012]具体的,所述第一管道和第二管道均为无缓冲管道。
[0013]具体的,每个协程运行时,在向第一管道发送信号后,读取第二管道。
[0014]本专利技术还提供一种基于Golang语言的多协程同步屏障装置,包括:初始化单元和同步单元,其中:
[0015]所述初始化单元,用于对同步屏障结构体进行初始化;所述同步屏障结构体包括第一管道和第二管道;
[0016]所述同步单元,用于执行同步屏障的过程,包括:
[0017]前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;
[0018]后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道
处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;
[0019]后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。
[0020]具体的,还包括计数单元,用于其中,每个协程运行时,选择器读取第一管道,如第一管道中有数据存在,则当前协程数量加一,并判断当前协程数量是否达到协程总数;
[0021]在当前协程数量达到协程总数时,关闭第二管道。
[0022]具体的,所述第一管道和第二管道均为无缓冲管道。
[0023]具体的,每个协程运行时,在向第一管道发送信号后,读取第二管道。
[0024]有益效果:与现有技术相比,本专利技术具有如下显著优点:利用Golang语言中的管道和选择器,通过多协程发送信号和读取管道的方式,达到多协程共同阻塞和同步唤醒,实现简单、便捷且高效率的协程同步。
附图说明
[0025]图1为本专利技术提供的基于Golang语言的多协程同步屏障方法的流程示意图。
具体实施方式
[0026]下面结合附图对本专利技术的技术方案作进一步说明。
[0027]参阅图1,其为本专利技术提供的基于Golang语言的多协程同步屏障方法的流程示意图。
[0028]本专利技术提供一种基于Golang语言的多协程同步屏障方法,首先定义同步屏障结构体,其中可以包括第一管道和第二管道,协程总数和当前协程数量。在即将开始要执行同步屏障功能时,可以对同步屏障结构体进行初始化。
[0029]本专利技术实施例中,第一管道和第二管道可以均为无缓冲管道。
[0030]在具体实施中,无缓冲管道指没有缓冲区的管道,往其中放入元素后立刻进入阻塞状态,必须从中通过读取等操作取走元素后,才能继续向其中放入元素。
[0031]本专利技术实施例中,其中,同步屏障结构体执行同步屏障的过程包括:
[0032]前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;
[0033]后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;
[0034]后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。
[0035]本专利技术实施例中,其中,每个协程运行时,选择器读取第一管道,如第一管道中有数据存在,则当前协程数量加一,并判断当前协程数量是否达到协程总数;
[0036]在当前协程数量达到协程总数时,关闭第二管道。
[0037]在具体实施中,运行的协程1向第一管道发送信号,即写入的第一管道的过程,并返回同步屏障结构体指针,由于无缓冲管道的特性,发送信号后协程1阻塞于第一管道,直到有其他协程从第一管道读取协程1所发送的信号时,即有读取的操作时,协程1才能被唤醒,从第一管道中被取走。
[0038]在具体实施中,在协程1(前一协程)阻塞于第一管道时,协程2(后一协程)可以读取第一管道中协程1的信号,将协程1从第一管道中取出,然后协程1进入第二管道,并阻塞于第二管道中,而协程2可以再向第一管道发送信号,阻塞于第一管道之中。
[0039]在具体实施中,在协程2(后一协程)阻塞在第一管道之中时,此时会有协程3读取第一管道中协程2的信号,将协程2从第一管道中取出,然后协程2和协程1共同阻塞在第二管道之中,协程3向第一管道发送信号,阻塞在第一管道之中。如此往复,在经过第一管道之后,协程1、2、3、
……
、n共同阻塞在第二管道之中,等待全部被唤醒激活后,共同执行后续操作。
[0040]在具体实施中,在每次协程运行时,选择器(select)可以读取第一管道,在第一管道有数据时,当前协程数量加一,例如协程1阻塞于第一管道时,当前协程数量计数为1,协程2阻塞于第一管道时,当前协程数量计数为2。在当前协程数量计数达到协程总数n时,协程n关闭第二管道,此时阻塞在第二管道处的前n

1个协程全部被唤醒激活,执行后续操作,可以对协程n进行读取操作,将协程n进行唤醒激活。
[0041]本专利技术实施例中,每个协程运行时,在向第一管道发送信号后,读取第二管道。
[0042]本专利技术还提供一种基于Golang语言的多协程同步屏障装置,包括:初始化单元和同步单元,其中:
[0043]所述初始化单本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于Golang语言的多协程同步屏障方法,其特征在于,包括:对同步屏障结构体进行初始化;所述同步屏障结构体包括第一管道和第二管道;其中,同步屏障结构体执行同步屏障的过程包括:前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。2.根据权利要求1所述的基于Golang语言的多协程同步屏障方法,其特征在于,包括:其中,每个协程运行时,选择器读取第一管道,如第一管道中有数据存在,则当前协程数量加一,并判断当前协程数量是否达到协程总数;在当前协程数量达到协程总数时,关闭第二管道。3.根据权利要求2所述的基于Golang语言的多协程同步屏障方法,其特征在于,所述第一管道和第二管道均为无缓冲管道。4.根据权利要求3所述的基于Golang语言的多协程同步屏障方法,其特征在于,每个协程运行时,在向第一管道发送信号后,读取第二管道。5.一种基于Golang语言的多协程同...

【专利技术属性】
技术研发人员:苏楷
申请(专利权)人:的卢技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1