MST

星途 面试题库

面试题:Go中如何实现简单的线程(goroutine)同步

在Go语言中,当多个goroutine同时访问和修改共享资源时可能会导致数据竞争。请描述如何使用`sync.Mutex`和`sync.WaitGroup`来实现简单的线程同步,以避免数据竞争,并给出相应的代码示例。
16.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用sync.Mutex避免数据竞争
    • sync.Mutex(互斥锁)用于保护共享资源,确保在同一时间只有一个goroutine可以访问共享资源。当一个goroutine获取了锁,其他goroutine必须等待锁被释放后才能获取锁并访问共享资源。
  2. 使用sync.WaitGroup等待所有goroutine完成
    • sync.WaitGroup用于等待一组goroutine完成。主goroutine可以使用WaitGroup来阻塞,直到所有相关的goroutine都完成它们的任务。
  3. 代码示例
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() {
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment()
    }
    wg.Wait()
    fmt.Println("Final counter value:", counter)
}

在上述代码中:

  • counter是共享资源,多个goroutine会对其进行修改。
  • musync.Mutex类型的互斥锁,在increment函数中,mu.Lock()获取锁,确保只有一个goroutine可以执行counter++操作,操作完成后通过mu.Unlock()释放锁。
  • wgsync.WaitGroup类型,在启动每个goroutine前,通过wg.Add(1)增加等待组的计数,在increment函数中通过defer wg.Done()减少计数,主goroutine通过wg.Wait()等待所有goroutine完成任务,最后输出counter的最终值。这样就避免了数据竞争问题。