go条件变量同步机制

Posted hualou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go条件变量同步机制相关的知识,希望对你有一定的参考价值。

sync.Cond代表条件变量,需要配置锁才能有用

package main

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

func main() {

    runtime.GOMAXPROCS(4)

    testCond()
}

func testCond() {

    c := sync.NewCond(&sync.Mutex{})
    condition := false

    go func() {
        time.Sleep(time.Second * 1)                       
        c.L.Lock()                                //3 获得锁
        fmt.Println("[1] 变更condition状态,并发出变更通知.")
        condition = true
        c.Signal() //c.Broadcast()                //4 唤醒阻塞的main程,但是由于锁还没有释放,main抢不到锁会继续向下执行
        time.Sleep(1 * time.Second)
        fmt.Println("[1] 继续后续处理.")
        c.L.Unlock() //5 释放锁,main抢到锁,接着执行

    }()

    c.L.Lock()                                                     //1 先获得锁
    fmt.Println("[2] condition..........1")
    for !condition {
        fmt.Println("[2] condition..........2")
        //等待Cond消息通知
        c.Wait()                                            //2 阻塞main,释放锁
        fmt.Println("[2] condition..........3")                   //6 go程释放了锁 获得锁然后继续执行
    }
    fmt.Println("[2] condition..........4")
    c.L.Unlock()                                            //7解锁
    time.Sleep(1 * time.Second)
    fmt.Println("main end...")
}




以上是关于go条件变量同步机制的主要内容,如果未能解决你的问题,请参考以下文章

你知道的Go切片扩容机制可能是错的

Golang 锁和条件变量

线程同步——条件变量

线程同步——条件变量

10-openldap同步原理

Go36-27,28-条件变量