第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go編程語言相互并發(fā)執(zhí)行

Go編程語言相互并發(fā)執(zhí)行

Go
PIPIONE 2021-05-03 12:08:52
我有兩個并發(fā)的go例程,如下所示,Routine 1{                                                  routine procedure   critical section{                                                     }routine procedure                        } Routine 2{                                                  routine procedure   critical section{                                                     }routine procedure                       } 是否可以通過使用一些內(nèi)置函數(shù)來實現(xiàn)關(guān)鍵部分?
查看完整描述

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()

}


查看完整回答
反對 回復(fù) 2021-05-10
?
郎朗坤

TA貢獻1921條經(jīng)驗 獲得超9個贊

您可以嘗試使用緩沖通道:

c := make(chan int, 2)

這將在實際發(fā)送之前緩沖發(fā)送的數(shù)據(jù)。


查看完整回答
反對 回復(fù) 2021-05-10
?
喵喵時光機

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


查看完整回答
反對 回復(fù) 2021-05-10
  • 3 回答
  • 0 關(guān)注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號