MST

星途 面试题库

面试题:Go语言WaitGroup与并发资源管理

假设你有一个应用程序,其中多个goroutine需要访问并修改共享资源,同时使用WaitGroup来同步这些goroutine。请说明如何防止竞态条件的发生,并结合WaitGroup给出示例代码。
34.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

为了防止竞态条件的发生,可以使用Go语言中的sync.Mutex(互斥锁)来保护共享资源。sync.Mutex提供了一种机制,确保在同一时间只有一个goroutine可以访问共享资源。

下面是一个结合WaitGroupsync.Mutex的示例代码:

package main

import (
    "fmt"
    "sync"
)

var (
    counter int
    mu      sync.Mutex
    wg      sync.WaitGroup
)

func increment() {
    defer wg.Done()
    mu.Lock()
    counter++
    mu.Unlock()
}

func main() {
    numGoroutines := 1000
    for i := 0; i < numGoroutines; i++ {
        wg.Add(1)
        go increment()
    }
    wg.Wait()
    fmt.Printf("Final counter value: %d\n", counter)
}

在上述代码中:

  1. counter 是共享资源,所有goroutine都会对其进行修改。
  2. mu 是一个sync.Mutex实例,用于保护counter
  3. wg 是一个sync.WaitGroup实例,用于同步所有goroutine。

increment函数中,通过调用mu.Lock()来锁定互斥锁,确保在同一时间只有一个goroutine可以修改counter。修改完成后,调用mu.Unlock()释放锁。

main函数中,启动1000个goroutine,每个goroutine都会调用increment函数。通过wg.Wait()等待所有goroutine完成,最后输出counter的最终值。这样就可以有效地防止竞态条件的发生。