Go sync.Cond 的代码示范

27 min read

以下是一个使用 Go sync.Cond 的简单代码示例:

package main

import (
    "sync"
    "fmt"
)

func main() {
    var mu sync.Mutex
    cond := sync.NewCond(&mu)
    
    go func() {
        for {
            // 等待条件成立
            cond.L.Lock()
            cond.Wait()
            fmt.Println("Goroutine 1: Condition is true!")
            cond.L.Unlock()
        }
    }()
    
    go func() {
        for {
            // 等待 1 秒
            time.Sleep(1 * time.Second)
            // 修改共享变量
            mu.Lock()
            fmt.Println("Goroutine 2: Condition is now true!")
            cond.Signal() // 发送信号通知条件成立
            mu.Unlock()
        }
    }()
    
    // 等待 10 秒,观察输出
    time.Sleep(10 * time.Second)
}

在此示例中,我们创建了一个互斥锁和一个条件变量(cond)。我们创建了两个 goroutine,其中一个等待条件成立,另一个则会修改共享变量并通知条件成立。在主函数中,我们等待 10 秒钟,以便观察输出。

示例中的第一个 goroutine 在进入无限循环后,会等待满足条件变量。使用 cond.Wait() 函数,这个 goroutine 会释放互斥锁,等待条件变量满足之后再继续执行。一旦满足条件,goroutine 会被唤醒,并继续执行相应的操作。

第二个 goroutine 在等待 1 秒后,会获取互斥锁,修改共享变量,然后使用 cond.Signal() 函数发出信号,通知其他的 goroutine 条件已经满足。此时第一个 goroutine 被唤醒,输出一条消息,然后重新等待条件满足。

总之,这个示例演示了如何使用 Go sync.Cond 实现线程同步,以等待某些条件满足。