代码拉取完成,页面将自动刷新
package main
import (
"fmt"
"sync"
"time"
)
type ConditionDetails struct {
mu sync.Mutex
cond *sync.Cond
value int
}
// 条件变量的内部工作原理: Wait方法的执行步骤:
// 1. 获取关联的互斥锁
// 2. 检查条件是否满足
// 3. 如果条件不满足,将当前goroutine加入等待队列
// 4. 释放互斥锁并阻塞当前goroutine
// 5. 被唤醒后重新获取互斥锁
// 6. 再次检查条件(防止虚假唤醒)
func (cd *ConditionDetails) WaitExample() {
fmt.Println("=== Wait方法执行流程 ===")
// Goroutine 1: 展示Wait的执行步骤
go func() {
cd.mu.Lock()
fmt.Println("步骤1: 获取锁成功")
for cd.value < 5 {
fmt.Println("步骤2: 检查条件不满足 (value < 5)")
fmt.Println("步骤3: 调用cond.Wait()")
fmt.Println(" - 将当前goroutine加入等待队列")
fmt.Println(" - 释放锁")
cd.cond.Wait() // 这里会阻塞
fmt.Println("步骤6: 被唤醒,重新获取锁")
fmt.Println("步骤7: 再次检查条件")
}
fmt.Println("步骤8: 条件满足,执行临界区代码")
cd.mu.Unlock()
}()
// Goroutine 2: 修改条件
time.Sleep(100 * time.Millisecond)
go func() {
time.Sleep(1 * time.Second)
cd.mu.Lock()
fmt.Println("步骤4: 另一个goroutine获取锁")
cd.value = 10
fmt.Println("步骤5: 修改条件并调用cond.Signal()")
cd.cond.Signal() // 唤醒等待的goroutine
cd.mu.Unlock()
}()
time.Sleep(3 * time.Second)
}
func main() {
cd := &ConditionDetails{}
cd.cond = sync.NewCond(&cd.mu)
cd.WaitExample()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。