Go 中的協(xié)程同步2

chan同步

繼續(xù)上一篇的協(xié)程同步嗅回,我們發(fā)現(xiàn)主程序里用了sleep等待所有任務(wù)執(zhí)行完畢及穗。這樣顯然不夠好,那么繼續(xù)尋找其它答案來(lái)解決绵载。埂陆。苛白。
設(shè)想,當(dāng)要執(zhí)行多個(gè)任務(wù)時(shí)焚虱,如果每個(gè)任務(wù)在結(jié)束時(shí)返回給調(diào)用者一個(gè)完成的信號(hào)购裙,那么我們就可以拿著所有返回的信號(hào),與總?cè)蝿?wù)個(gè)數(shù)做對(duì)比鹃栽。這樣就能知道任務(wù)究竟有沒(méi)有執(zhí)行完畢了躏率,于是我們就利用chan的特性解決問(wèn)題

package main

import (
    "time"
    "fmt"
    "sync"
)

type Account struct {
    flag sync.Mutex     // 使用一種復(fù)用變量, 只有一個(gè)人鎖住民鼓,其他人就會(huì)sleep 直到解鎖
    money int
}

func (a *Account)DoPre()  {
    time.Sleep(time.Millisecond)    // 模仿銀行進(jìn)行檢測(cè)
}

func (a *Account)GetGongzi(n int)  {
    a.money += n
}
func (a *Account) GiveWife(n int) {
    a.flag.Lock()       // 鎖住
    if a.money > n {
        a.DoPre()
        a.money -= n
    }
    a.flag.Unlock()     // 釋放鎖
}

func (a *Account)Buy(n int)  {
    a.flag.Lock()
    if a.money > n {
        a.DoPre()
        a.money -= n
    }
    a.flag.Unlock()
}

func (a *Account) Left() int {
    return a.money
}


func main() {
    var account Account
    task_chan := make(chan int)    // 創(chuàng)建專門接受信號(hào)的chan
    account.GetGongzi(10)

    go func() {
        account.GiveWife(6)
        task_chan <- 0          // 任務(wù)結(jié)束發(fā)送完成信號(hào)
    }()

    go func() {
        account.Buy(5)      
        task_chan <- 0          // 發(fā)送完成信號(hào)
    }()
    for i :=0; i <2; i++ {      // 循環(huán)接受chan數(shù)據(jù) 直到全部執(zhí)行完畢
        <- task_chan
    }
    fmt.Println(account.Left())
}
waitgroup

go里面還自帶了一種用于協(xié)程同步的方案薇芝,它會(huì)自動(dòng)的等待任務(wù)結(jié)束,并返回相應(yīng)的信號(hào)

package main

import (
    "time"
    "fmt"
    "sync"
)

type Accout struct {
    lock sync.Locker
    money int
}

func (a *Accout) DoPrepare()  {
    time.Sleep(time.Second)

}

func (a *Accout) GetGongZi(n int)  {
    a.money += n
}

func (a *Accout) GiveWife(n int)  {
    a.lock.Lock()
    if a.money > n{
        a.money -= n
    }
    a.lock.Unlock()
}

func (a *Accout) Buy(n int)  {
    a.lock.Lock()
    if a.money > n{
        a.money -= n
    }
    a.lock.Unlock()
}

func (a *Accout) Left() int  {
    return a.money
}


func main() {
    var account Accout
    account.GetGongZi(10)

    wg := new(sync.WaitGroup)    // 創(chuàng)建waitgroup
    wg.Add(2)    // add的個(gè)數(shù)要跟任務(wù)個(gè)數(shù)一致
    go func() {
        account.GiveWife(6)
        wg.Done()          // 任務(wù)執(zhí)行完畢
    }()

    go func() {
        account.Buy(5)
        wg.Done()
    }()

    wg.Wait()      // 等待所有任務(wù)執(zhí)行完畢

    fmt.Println(account.Left())
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丰嘉,一起剝皮案震驚了整個(gè)濱河市夯到,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饮亏,老刑警劉巖砂蔽,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褒纲,死亡現(xiàn)場(chǎng)離奇詭異真竖,居然都是意外死亡熄驼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門劝赔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胆敞,你說(shuō)我怎么就攤上這事着帽。” “怎么了移层?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵仍翰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我观话,道長(zhǎng)予借,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任频蛔,我火速辦了婚禮灵迫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晦溪。我一直安慰自己瀑粥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布三圆。 她就那樣靜靜地躺著狞换,像睡著了一般避咆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上修噪,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天查库,我揣著相機(jī)與錄音,去河邊找鬼黄琼。 笑死樊销,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的适荣。 我是一名探鬼主播现柠,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼弛矛!你這毒婦竟也來(lái)了够吩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丈氓,失蹤者是張志新(化名)和其女友劉穎周循,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體万俗,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡湾笛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闰歪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚎研。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖库倘,靈堂內(nèi)的尸體忽然破棺而出临扮,到底是詐尸還是另有隱情,我是刑警寧澤教翩,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布杆勇,位于F島的核電站,受9級(jí)特大地震影響饱亿,放射性物質(zhì)發(fā)生泄漏蚜退。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一彪笼、第九天 我趴在偏房一處隱蔽的房頂上張望钻注。 院中可真熱鬧,春花似錦配猫、人聲如沸队寇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佳遣。三九已至识埋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間零渐,已是汗流浹背窒舟。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诵盼,地道東北人惠豺。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像风宁,于是被迫代替她去往敵國(guó)和親洁墙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接:https://github.com/EasyKotlin 在常用的并發(fā)模型中戒财,多進(jìn)程热监、多線程、分布式是...
    JackChen1024閱讀 10,732評(píng)論 3 23
  • Coroutine in Python 引言: 本文出自David Beazley 的關(guān)于協(xié)程的PPT饮寞,現(xiàn)在筆者將...
    LumiaXu閱讀 1,603評(píng)論 4 8
  • 本文主要介紹協(xié)程的用法, 以及使用協(xié)程能帶來(lái)什么好處. 另外, 也會(huì)粗略提一下協(xié)程的大致原理.本文的意義可能僅僅是...
    登高而望遠(yuǎn)閱讀 35,220評(píng)論 18 140
  • 原創(chuàng)文章出自公眾號(hào):「碼農(nóng)富哥」孝扛,如需轉(zhuǎn)載請(qǐng)請(qǐng)注明出處!文章如果對(duì)你有收獲幽崩,可以收藏轉(zhuǎn)發(fā)苦始,這會(huì)給我一個(gè)大大鼓勵(lì)喲!...
    大富帥閱讀 9,921評(píng)論 3 21
  • 有一個(gè)女生慌申,很喜歡很喜歡一個(gè)男生陌选,可那個(gè)男生卻一直喜歡的是另一個(gè)女生。后來(lái)他和他喜歡的女孩子在一起了蹄溉,女生很傷心柠贤,...
    帥滾滾閱讀 218評(píng)論 0 1