美文网首页
07-并发-03-携程同步

07-并发-03-携程同步

作者: 玄德公笔记 | 来源:发表于2021-11-21 14:41 被阅读0次

    1. 代码结构

    在这里插入图片描述

    2 gorotine.go

    package gorotine
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    //定义WG,用sync中的函数来同步数据
    var WG sync.WaitGroup
    
    func Read()  {
        for i :=0 ; i<=10 ; i++ {
            WG.Add(1)
        }
    }
    
    func Write() {
        for i :=0 ; i <= 10 ; i++ {
            time.Sleep(time.Second * 1)
            fmt.Println("Done >",i)
            WG.Done()
        }
    }
    

    说明:
    Add(n) 把计数器设置为n
    Done() 每次把计数器-1
    wait() 会阻塞代码的运行,直到计数器地值减为0
    以上可知:
    如果我把n 设置成2,那么我在下文main.go中可以打开两个协程执行WG.Write()
    如果我把n仍设置成1,而在main.go中坚持打开两个协程执行WG.Write(),那写到5就报错了。除非我把Write()中的循环条件写成i=0;i<=21;i++

    3 main.go

    package main
    
    import (
        "814/gorotine"
        "fmt"
        "time"
    )
    
    func main () {
        //主线程来读(上文可知,此时WG的计数器被设置为1)
        gorotine.Read()
        //开启一个协程来写(写完后计数器被-1,为0)
        go gorotine.Write()
        //主线程等待协程写完(阻塞代码,知道计数器为0)
        gorotine.WG.Wait()
        //协程写完后主线程打印一个标记
        fmt.Println("All dome")
        //主线程等两秒后退出
        time.Sleep(time.Second * 2 )
    }
    

    4. 输出

    Done > 0
    Done > 1
    Done > 2
    Done > 3
    Done > 4
    Done > 5
    Done > 6
    Done > 7
    Done > 8
    Done > 9
    Done > 10
    All dome
    
    Process finished with the exit code 0
    

    相关文章

      网友评论

          本文标题:07-并发-03-携程同步

          本文链接:https://www.haomeiwen.com/subject/aabhtrtx.html