基于Golang语言的多协程同步屏障方法、装置与流程


基于golang语言的多协程同步屏障方法、装置
技术领域
1.本发明涉及并行计算技术领域,尤其涉及一种基于golang语言的多协程同步屏障方法、装置。


背景技术:

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


技术实现要素:

4.发明目的:本发明提供一种基于golang语言的多协程同步屏障方法、装置,旨在实现简单、便捷且高效率的同步方法。
5.技术方案:本发明提供一种基于golang语言的多协程同步屏障方法,包括:
6.对同步屏障结构体进行初始化;所述同步屏障结构体包括第一管道和第二管道;
7.其中,同步屏障结构体执行同步屏障的过程包括:
8.前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;
9.后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;
10.后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。
11.具体的,其中,每个协程运行时,选择器读取第一管道,如第一管道中有数据存在,则当前协程数量加一,并判断当前协程数量是否达到协程总数;在当前协程数量达到协程总数时,关闭第二管道。
12.具体的,所述第一管道和第二管道均为无缓冲管道。
13.具体的,每个协程运行时,在向第一管道发送信号后,读取第二管道。
14.本发明还提供一种基于golang语言的多协程同步屏障装置,包括:初始化单元和同步单元,其中:
15.所述初始化单元,用于对同步屏障结构体进行初始化;所述同步屏障结构体包括第一管道和第二管道;
16.所述同步单元,用于执行同步屏障的过程,包括:
17.前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;
18.后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道
处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;
19.后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。
20.具体的,还包括计数单元,用于其中,每个协程运行时,选择器读取第一管道,如第一管道中有数据存在,则当前协程数量加一,并判断当前协程数量是否达到协程总数;
21.在当前协程数量达到协程总数时,关闭第二管道。
22.具体的,所述第一管道和第二管道均为无缓冲管道。
23.具体的,每个协程运行时,在向第一管道发送信号后,读取第二管道。
24.有益效果:与现有技术相比,本发明具有如下显著优点:利用golang语言中的管道和选择器,通过多协程发送信号和读取管道的方式,达到多协程共同阻塞和同步唤醒,实现简单、便捷且高效率的协程同步。
附图说明
25.图1为本发明提供的基于golang语言的多协程同步屏障方法的流程示意图。
具体实施方式
26.下面结合附图对本发明的技术方案作进一步说明。
27.参阅图1,其为本发明提供的基于golang语言的多协程同步屏障方法的流程示意图。
28.本发明提供一种基于golang语言的多协程同步屏障方法,首先定义同步屏障结构体,其中可以包括第一管道和第二管道,协程总数和当前协程数量。在即将开始要执行同步屏障功能时,可以对同步屏障结构体进行初始化。
29.本发明实施例中,第一管道和第二管道可以均为无缓冲管道。
30.在具体实施中,无缓冲管道指没有缓冲区的管道,往其中放入元素后立刻进入阻塞状态,必须从中通过读取等操作取走元素后,才能继续向其中放入元素。
31.本发明实施例中,其中,同步屏障结构体执行同步屏障的过程包括:
32.前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;
33.后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;
34.后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。
35.本发明实施例中,其中,每个协程运行时,选择器读取第一管道,如第一管道中有数据存在,则当前协程数量加一,并判断当前协程数量是否达到协程总数;
36.在当前协程数量达到协程总数时,关闭第二管道。
37.在具体实施中,运行的协程1向第一管道发送信号,即写入的第一管道的过程,并返回同步屏障结构体指针,由于无缓冲管道的特性,发送信号后协程1阻塞于第一管道,直到有其他协程从第一管道读取协程1所发送的信号时,即有读取的操作时,协程1才能被唤醒,从第一管道中被取走。
38.在具体实施中,在协程1(前一协程)阻塞于第一管道时,协程2(后一协程)可以读取第一管道中协程1的信号,将协程1从第一管道中取出,然后协程1进入第二管道,并阻塞于第二管道中,而协程2可以再向第一管道发送信号,阻塞于第一管道之中。
39.在具体实施中,在协程2(后一协程)阻塞在第一管道之中时,此时会有协程3读取第一管道中协程2的信号,将协程2从第一管道中取出,然后协程2和协程1共同阻塞在第二管道之中,协程3向第一管道发送信号,阻塞在第一管道之中。如此往复,在经过第一管道之后,协程1、2、3、
……
、n共同阻塞在第二管道之中,等待全部被唤醒激活后,共同执行后续操作。
40.在具体实施中,在每次协程运行时,选择器(select)可以读取第一管道,在第一管道有数据时,当前协程数量加一,例如协程1阻塞于第一管道时,当前协程数量计数为1,协程2阻塞于第一管道时,当前协程数量计数为2。在当前协程数量计数达到协程总数n时,协程n关闭第二管道,此时阻塞在第二管道处的前n

1个协程全部被唤醒激活,执行后续操作,可以对协程n进行读取操作,将协程n进行唤醒激活。
41.本发明实施例中,每个协程运行时,在向第一管道发送信号后,读取第二管道。
42.本发明还提供一种基于golang语言的多协程同步屏障装置,包括:初始化单元和同步单元,其中:
43.所述初始化单元,用于对同步屏障结构体进行初始化;所述同步屏障结构体包括第一管道和第二管道;
44.所述同步单元,用于执行同步屏障的过程,包括:
45.前一协程运行,读取第一管道后向第一管道发送信号,并被阻塞于所述第一管道处;
46.后一协程运行,读取第一管道中前一协程所发送的信号后,前一协程于第一管道处被唤醒并被阻塞于第二管道处,后一协程被阻塞于第一管道处;
47.后一协程于第一管道处被唤醒后,与前一协程共同被阻塞于第二管道处,直到第二管道被关闭,所有被阻塞于第二管道的协程全部被唤醒。
48.本发明实施例中,基于golang语言的多协程同步屏障装置,还包括计数单元,用于其中,每个协程运行时,选择器读取第一管道,如第一管道中有数据存在,则当前协程数量加一,并判断当前协程数量是否达到协程总数;
49.在当前协程数量达到协程总数时,关闭第二管道。
50.本发明实施例中,所述第一管道和第二管道均为无缓冲管道。
51.本发明实施例中,每个协程运行时,在向第一管道发送信号后,读取第二管道。