【Golang 面试题】每日 3 题(三十六)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/UWz06

📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

106. Cond 中 Wait 介绍

在 Go 语言中,sync.Cond 类型提供了 Wait() 方法来让 Goroutine 等待条件变量。当 Goroutine 调用 Wait() 方法时,它会释放已经持有的锁,并阻塞在条件变量上,直到另一个 Goroutine 调用 Signal() 或 Broadcast() 方法,并释放锁,唤醒了它。被唤醒的 Goroutine 会重新尝试获得锁,然后继续执行。

107. Cond 中 Wait 使用

下面是一个使用 sync.Cond 和 Wait() 方法的示例:

go 复制代码
package main
import (
    "fmt"
    "sync"
    "time"
)
func main() {
    var mutex sync.Mutex
    cond := sync.NewCond(&mutex)
    ready := false
    go func() {
        time.Sleep(time.Second * 1)
        mutex.Lock()
        ready = true
        cond.Signal()
        mutex.Unlock()
    }()
    mutex.Lock()
    for !ready {
        cond.Wait()
    }
    mutex.Unlock()
    fmt.Println("Goroutine is ready")
}

在这个例子中,我们首先创建了一个 sync.Mutex 实例和一个与之关联的 sync.Cond 实例。我们在一个 Goroutine 中等待 1 秒钟,然后发送一个 Signal() 信号来唤醒等待条件变量的 Goroutine。在主 Goroutine 中,我们首先获取了锁,然后开始等待条件变量。在等待过程中,Goroutine 会释放锁并阻塞在条件变量上,直到另一个 Goroutine 发送了 Signal() 信号并唤醒了它。被唤醒的 Goroutine 会重新尝试获取锁,并在获取到锁后输出一条消息。

需要注意的是,调用 Wait() 方法之前必须先获取锁,否则会出现死锁等问题。另外,在使用 Wait() 方法时,要确保有其他 Goroutine 会发送 Signal() 或 Broadcast() 信号,否则可能会导致 Goroutine 永久阻塞。

108. WaitGroup 用法

在 Go 语言中,sync.WaitGroup 类型提供了一种方便的方式来等待多个 Goroutine 完成它们的任务。WaitGroup 可以被用来跟踪一组 Goroutine,等待它们完成任务并汇总结果。下面是 WaitGroup 的基本用法示例:

go 复制代码
package main
import (
    "fmt"
    "sync"
)
func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            fmt.Printf("Goroutine %d\n", i)
            wg.Done()
        }(i)
    }
    wg.Wait()
    fmt.Println("All Goroutines are done")
}

在这个示例中,我们首先创建了一个 sync.WaitGroup 实例。然后,在一个 for 循环中创建了 5 个 Goroutine,并调用 wg.Add(1) 方法将计数器加 1,表示有一个 Goroutine 需要等待。在每个 Goroutine 中,我们输出了一条消息,表示该 Goroutine 正在执行任务,并调用 wg.Done() 方法将计数器减 1,表示该 Goroutine 已经完成任务。最后,我们调用 wg.Wait() 方法等待所有 Goroutine 完成任务,然后输出一条消息表示所有 Goroutine 都已完成。

需要注意的是,调用 Add() 方法之后必须调用 Done() 方法,否则会出现死锁等问题。另外,在等待所有 Goroutine 完成任务时,要确保所有 Goroutine 都已经调用了 Done() 方法,否则可能会导致程序永久阻塞。

WaitGroup 还提供了一个 WaitGroup.Add() 方法,可以将计数器增加指定的值,以便一次性添加多个需要等待的 Goroutine。另外,WaitGroup 还支持嵌套使用,即在一个 Goroutine 中使用 WaitGroup 等待一组 Goroutine 完成任务,并在另一个 WaitGroup 中使用这个 Goroutine 作为一项任务等待其他 Goroutine 完成任务。

相关推荐
推送者2 小时前
用宠物照片制作桌宠:从AI拆帧到九点标定的本地化实现笔记
笔记·宠物·用宠物照片制作桌宠
一条破秋裤2 小时前
16_TIM编码器接口测速
笔记·stm32·学习
tju新生代魔迷2 小时前
Verilog HDL 学习笔记(十)| 第10章 时序和延迟
笔记·学习·fpga开发
IT_陈寒3 小时前
React的状态更新坑得我差点加班到天亮
前端·人工智能·后端
明月_清风3 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
天下无敌笨笨熊3 小时前
C#Modbus串口开发心得
开发语言·c#
电商API_180079052473 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11113 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
如意猴3 小时前
【C++】001--C++入门(1)
开发语言·c++
小HANN3 小时前
Linux建站实战:CentOS7+LNMP 从零部署 ECShop 开源电商系统
linux·运维·服务器·经验分享