Golang如何使用 sync.Cond 进行 Goroutine 的条件变量同步?

在 Go 语言中,sync.Cond 是一个条件变量,它提供了类似于 POSIX 线程条件变量的功能,用于 Goroutine 之间的同步和通信。sync.Cond 可以用于等待某个特定条件的满足,然后通知等待的 Goroutine,以便它们可以继续执行。

sync.Cond 的使用过程主要包括以下几个步骤:

  • 1、创建一个 sync.Cond 对象
  • 2、对需要等待的条件进行加锁
  • 3、在等待条件之前调用 sync.Cond.Wait 方法进行等待
  • 4、在条件满足时调用 sync.Cond.Signal 或 sync.Cond.Broadcast 方法唤醒等待的 Goroutine
  • 5、在条件满足后解锁

下面是一个使用 sync.Cond 进行 Goroutine 的条件变量同步的示例代码:

package main

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

var (
    count int
    cond  *sync.Cond = sync.NewCond(&sync.Mutex{})
)

func main() {
    go func() {
        for i := 0; i < 10; i++ {
            time.Sleep(1 * time.Second)
            increment()
        }
    }()

    go func() {
        for i := 0; i < 10; i++ {
            time.Sleep(2 * time.Second)
            decrement()
        }
    }()

    time.Sleep(30 * time.Second)
}

func increment() {
    cond.L.Lock()
    defer cond.L.Unlock()

    count++
    fmt.Printf("Incremented: %d",count)
}