Golang Goroutine 顺序打印

Jackey Golang 2,109 次浏览 没有评论

题目要求:

有三个函数,分别打印“dog”,“fish”,“cat”,要求每个函数都起一个Goroutine,请按照“dog”,“fish”,“cat”的顺序打印在屏幕上,100次。

解题代码:

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

func main()  {
    var wg sync.WaitGroup
    var dogCounter uint64
    var fishCounter uint64
    var catCounter uint64
    dogCh := make(chan struct{}, 1)
    fishCh := make(chan struct{}, 1)
    catCh := make(chan struct{}, 1)

    wg.Add(3)
    go dog(&wg, dogCounter, dogCh, fishCh)
    go fish(&wg, fishCounter, fishCh, catCh)
    go cat(&wg, catCounter, catCh, dogCh)
    dogCh <- struct{}{}
    wg.Wait()
}

func dog(wg *sync.WaitGroup, counter uint64, dogCh, fishCh chan struct{})  {
    for {
        if counter >= uint64(100) {
            wg.Done()
            return
        }
        <- dogCh
        fmt.Println("dog")
        atomic.AddUint64(&counter, 1)
        fishCh <- struct{}{}
    }
}

func fish(wg *sync.WaitGroup, counter uint64, fishCh, catCh chan struct{})  {
    for {
        if counter >= uint64(100) {
            wg.Done()
            return
        }
        <- fishCh
        fmt.Println("fish")
        atomic.AddUint64(&counter, 1)
        catCh <- struct{}{}
    }
}

func cat(wg *sync.WaitGroup, counter uint64, catCh, dogCh chan struct{})  {
    for {
        if counter >= uint64(100) {
            wg.Done()
            return
        }
        <- catCh
        fmt.Println("cat")
        atomic.AddUint64(&counter, 1)
        dogCh <- struct{}{}
    }
}

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go