MST

星途 面试题库

面试题:Go语言中Barrier如何实现基本的并发任务协调

请简要描述在Go语言中实现Barrier来协调并发任务的基本思路,假设需要等待N个goroutine都到达某一点后再继续执行后续逻辑,用伪代码展示关键步骤。
44.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 基本思路
    • 使用sync.Cond和一个计数器来实现Barrier。sync.Cond依赖于一个sync.Mutex,通过这个互斥锁来保护共享状态(计数器)。
    • 每个goroutine在到达Barrier点时,获取互斥锁,递减计数器。如果计数器不为0,就等待在Cond上;当计数器减到0时,说明所有goroutine都已到达,通过CondBroadcast方法唤醒所有等待的goroutine。
  2. 伪代码
package main

import (
    "fmt"
    "sync"
)

func main() {
    const N = 3
    var wg sync.WaitGroup
    var mu sync.Mutex
    cond := sync.NewCond(&mu)
    count := N

    for i := 0; i < N; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            mu.Lock()
            count--
            if count > 0 {
                cond.Wait()
            } else {
                cond.Broadcast()
            }
            mu.Unlock()
            // 所有goroutine都到达后执行的逻辑
            fmt.Printf("Goroutine %d continues after barrier\n", id)
        }(i)
    }
    wg.Wait()
}