Golang协程同步方法详解
使用channel可实现协程同步,如通过无缓冲channel等待任务完成:main函数创建done通道,启动协程执行任务并发送完成信号,主线程接收信号后继续,确保任务结束前不退出。
使用channel可实现协程同步,如通过无缓冲channel等待任务完成:main函数创建done通道,启动协程执行任务并发送完成信号,主线程接收信号后继续,确保任务结束前不退出。

在Golang中,协程(goroutine)之间的同步主要依赖于通道(channel)和标准库提供的同步原语。合理使用这些机制可以避免竞态条件、死锁等问题,确保多个协程协同工作时数据一致且执行有序。
使用 channel 进行协程通信与同步
Go提倡“通过通信共享内存”,而不是通过共享内存来通信。channel 是实现这一理念的核心工具。
无缓冲 channel 可用于两个协程间的同步点,比如等待某个任务完成:
示例:使用 channel 等待协程结束
func main() {
done := make(chan bool)
go func() {
fmt.Println("开始执行任务")
time.Sleep(1 * time.Second)
fmt.Println("任务完成")
done <- true
}()
fmt.Println("等待任务完成...")
<-done
fmt.Println("主程序退出")
}
这里,主协程通过从 done 通道接收信号,实现对子协程的等待。
使用 sync.WaitGroup 等待多个协程
当需要等待多个协程完成时,sync.WaitGroup 更加方便。
它有三个方法:Add、Done、Wait。
示例:WaitGroup 控制多个协程同步
func main() {
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Printf("协程 %d 开始工作\n", id)
time.Sleep(time.Second)
fmt.Printf("协程 %d 完成\n", id)
}(i)
}
wg.Wait()
fmt.Println("所有协程已完成")
}
注意:Add 应在 goroutine 启动前调用,避免竞态;Done 通常用 defer 调用以确保执行。
使用 sync.Mutex 保护共享资源
当多个协程需要读写同一变量时,应使用互斥锁防止数据竞争。
示例:用 Mutex 保护计数器
func main() {
var mu sync.Mutex
var counter int
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}()
}
wg.Wait()
fmt.Println("最终计数:", counter)
}
如果不加锁,counter++ 可能出现竞态,结果小于预期。
结合 channel 和 context 实现超时控制
在实际应用中,常需限制协程执行时间。使用 context.WithTimeout 配合 channel 可安全中断操作。
示例:带超时的协程同步
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
ch := make(chan string)
go func() {
time.Sleep(3 * time.Second)
ch <- "任务完成"
}()
select {
case result := <-ch:
fmt.Println(result)
case <-ctx.Done():
fmt.Println("任务超时")
}
}
这样即使协程未完成,也能在超时后继续执行,避免主程序卡住。
基本上就这些。根据场景选择合适的同步方式:简单通知用 channel,批量等待用 WaitGroup,共享变量加 Mutex,复杂控制结合 context。关键是避免死锁和竞态,保证程序健壮。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















