3 回答

TA貢獻1804條經(jīng)驗 獲得超8個贊
你的問題:
我有N個并發(fā)的go例程(或多或少都出于相同的目的)。每一個都有一個關(guān)鍵部分。在進入關(guān)鍵部分之前,每個例程僅執(zhí)行一些消息發(fā)送工作。當它進入關(guān)鍵部分時,我需要所有其他例程都必須停止執(zhí)行,直到它退出關(guān)鍵部分為止。通過使用GO中的任何庫函數(shù)可以嗎?
您要問的是什么(在關(guān)鍵部分中出現(xiàn)一個goroutine時強制停止所有其他goroutine)在Go程序中并不常見。沒有庫函數(shù)可以停止所有其他goroutine,因此您需要通過在程序中的goroutine之間設(shè)計適當?shù)耐絹硗V顾鼈?。典型的情況是,所有g(shù)oroutine(潛在地)同時運行,除了那些以某種方式被阻塞的goroutine。
要控制Go程序中對共享資源的并發(fā)訪問,可以使用Go通道,"sync"程序包,管道或網(wǎng)絡(luò)連接。
使用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()
}

TA貢獻1846條經(jīng)驗 獲得超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
- 3 回答
- 0 關(guān)注
- 231 瀏覽
添加回答
舉報