Go编程语言相互并发执行

我有两个并发的go例程,如下所示,


Routine 1{                                                  


routine procedure   


critical section{                                                     

}


routine procedure                        


Routine 2{                                                  


routine procedure   


critical section{                                                     

}


routine procedure                       

是否可以通过使用一些内置函数来实现关键部分?


PIPIONE
浏览 204回答 3
3回答

胡说叔叔

你的问题:我有N个并发的go例程(或多或少都出于相同的目的)。每一个都有一个关键部分。在进入关键部分之前,每个例程仅执行一些消息发送工作。当它进入关键部分时,我需要所有其他例程都必须停止执行,直到它退出关键部分为止。通过使用GO中的任何库函数可以吗?您要问的是什么(在关键部分中出现一个goroutine时强制停止所有其他goroutine)在Go程序中并不常见。没有库函数可以停止所有其他goroutine,因此您需要通过在程序中的goroutine之间设计适当的同步来停止它们。典型的情况是,所有goroutine(潜在地)同时运行,除了那些以某种方式被阻塞的goroutine。要控制Go程序中对共享资源的并发访问,可以使用Go通道,"sync"程序包,管道或网络连接。使用sync.Mutex,Go代码可能看起来像这样(但请记住,只要有可能,Go程序最好使用Go通道而不是互斥锁):package mainimport "sync"var m sync.Mutexvar wg sync.WaitGroupfunc 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()}

郎朗坤

您可以尝试使用缓冲通道:c := make(chan int, 2)这将在实际发送之前缓冲发送的数据。

喵喵时光机

你的意思是这样吗?package mainimport "fmt"func ping(recv <-chan int, send chan<- int, end chan<- bool) {&nbsp; &nbsp; fmt.Println("ping")&nbsp; &nbsp; send <- 11&nbsp; &nbsp; send <- 12&nbsp; &nbsp; r1 := <-recv&nbsp; &nbsp; r2 := <-recv&nbsp; &nbsp; fmt.Println("ping", r1, r2)&nbsp; &nbsp; end <- true}func pong(recv <-chan int, send chan<- int, end chan<- bool) {&nbsp; &nbsp; fmt.Println("pong")&nbsp; &nbsp; r1 := <-recv&nbsp; &nbsp; r2 := <-recv&nbsp; &nbsp; send <- 21&nbsp; &nbsp; send <- 22&nbsp; &nbsp; fmt.Println("pong", r1, r2)&nbsp; &nbsp; end <- true}func main() {&nbsp; &nbsp; chEnd := make(chan bool)&nbsp; &nbsp; chPing := make(chan int, 2)&nbsp; &nbsp; chPong := make(chan int, 2)&nbsp; &nbsp; go ping(chPing, chPong, chEnd)&nbsp; &nbsp; go pong(chPong, chPing, chEnd)&nbsp; &nbsp; <-chEnd&nbsp; &nbsp; <-chEnd&nbsp; &nbsp; fmt.Println("end")}输出:pingpongpong 11 12ping 21 22end
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go