MST
星途 面试题库

面试题:Go中Go Barrier在简单任务同步场景的应用

假设你有一个任务列表,每个任务都是独立的计算任务,完成后需要汇总结果。请用Go语言结合Go Barrier实现任务同步并汇总结果,简述你的实现思路并给出关键代码片段。
32.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义任务结构体,包含任务的计算逻辑和结果存储。
  2. 使用sync.WaitGroup来等待所有任务完成。
  3. 使用go - barrier(实际Go标准库中没有go - barrier,这里假设使用sync.Cond实现类似功能)在所有任务完成后进行结果汇总。

关键代码片段

package main

import (
    "fmt"
    "sync"
)

// 定义任务结构体
type Task struct {
    id    int
    result int
}

// 任务计算函数
func (t *Task) compute(wg *sync.WaitGroup, cond *sync.Cond) {
    defer wg.Done()
    // 模拟任务计算
    t.result = t.id * 2
    cond.L.Lock()
    cond.Broadcast()
    cond.L.Unlock()
}

func main() {
    var wg sync.WaitGroup
    var mu sync.Mutex
    cond := sync.NewCond(&mu)
    tasks := make([]Task, 5)
    for i := range tasks {
        tasks[i].id = i
        wg.Add(1)
        go tasks[i].compute(&wg, cond)
    }

    // 等待所有任务完成
    go func() {
        wg.Wait()
        cond.L.Lock()
        cond.Broadcast()
        cond.L.Unlock()
    }()

    cond.L.Lock()
    cond.Wait()
    cond.L.Unlock()

    // 汇总结果
    total := 0
    for _, task := range tasks {
        total += task.result
    }
    fmt.Printf("汇总结果: %d\n", total)
}