为了账号安全,请及时绑定邮箱和手机立即绑定

Go编程语言相互并发执行

Go编程语言相互并发执行

Go
PIPIONE 2021-05-03 12:08:52
我有两个并发的go例程,如下所示,Routine 1{                                                  routine procedure   critical section{                                                     }routine procedure                        } Routine 2{                                                  routine procedure   critical section{                                                     }routine procedure                       } 是否可以通过使用一些内置函数来实现关键部分?
查看完整描述

3 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

你的问题:


我有N个并发的go例程(或多或少都出于相同的目的)。每一个都有一个关键部分。在进入关键部分之前,每个例程仅执行一些消息发送工作。当它进入关键部分时,我需要所有其他例程都必须停止执行,直到它退出关键部分为止。通过使用GO中的任何库函数可以吗?


您要问的是什么(在关键部分中出现一个goroutine时强制停止所有其他goroutine)在Go程序中并不常见。没有库函数可以停止所有其他goroutine,因此您需要通过在程序中的goroutine之间设计适当的同步来停止它们。典型的情况是,所有goroutine(潜在地)同时运行,除了那些以某种方式被阻塞的goroutine。


要控制Go程序中对共享资源的并发访问,可以使用Go通道,"sync"程序包,管道或网络连接。


使用sync.Mutex,Go代码可能看起来像这样(但请记住,只要有可能,Go程序最好使用Go通道而不是互斥锁):


package main


import "sync"


var m sync.Mutex

var wg sync.WaitGroup


func routine1() {

    ... do something ...


    m.Lock()

    ... critical section (access the shared resource here) ...

    m.Unlock()


    ... do something ...

    wg.Done()

}


func routine2() {

    ... do something ...


    m.Lock()

    ... critical section (access the shared resource here) ...

    m.Unlock()


    ... do something ...

    wg.Done()

}


func main() {

    wg.Add(1); go routine1()

    wg.Add(1); go routine2()

    wg.Wait()

}


查看完整回答
反对 回复 2021-05-10
?
郎朗坤

TA贡献1921条经验 获得超9个赞

您可以尝试使用缓冲通道:

c := make(chan int, 2)

这将在实际发送之前缓冲发送的数据。


查看完整回答
反对 回复 2021-05-10
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

你的意思是这样吗?


package main


import "fmt"


func ping(recv <-chan int, send chan<- int, end chan<- bool) {

    fmt.Println("ping")

    send <- 11

    send <- 12

    r1 := <-recv

    r2 := <-recv

    fmt.Println("ping", r1, r2)

    end <- true

}


func pong(recv <-chan int, send chan<- int, end chan<- bool) {

    fmt.Println("pong")

    r1 := <-recv

    r2 := <-recv

    send <- 21

    send <- 22

    fmt.Println("pong", r1, r2)

    end <- true

}


func main() {

    chEnd := make(chan bool)

    chPing := make(chan int, 2)

    chPong := make(chan int, 2)

    go ping(chPing, chPong, chEnd)

    go pong(chPong, chPing, chEnd)

    <-chEnd

    <-chEnd

    fmt.Println("end")

}

输出:


ping

pong

pong 11 12

ping 21 22

end


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信