MST

星途 面试题库

面试题:Go中扇入扇出模式下资源竞争产生的常见原因

在Go语言的扇入扇出模式编程中,请阐述资源竞争通常在哪些情况下容易产生,并举例说明。
38.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

资源竞争易产生的情况

  1. 多个 goroutine 同时读写共享变量:当多个 goroutine 同时对同一个变量进行读和写操作时,就可能出现资源竞争。例如多个 goroutine 同时向一个共享的 map 中写入数据。
  2. 共享通道操作冲突:多个 goroutine 同时对同一个通道进行发送(send)或接收(receive)操作,可能导致竞争状态。比如多个 goroutine 尝试同时向一个已满的无缓冲通道发送数据。

示例

  1. 共享变量读写竞争
package main

import (
    "fmt"
    "sync"
)

var counter int
var wg sync.WaitGroup

func increment() {
    defer wg.Done()
    for i := 0; i < 1000; i++ {
        counter++
    }
}

func main() {
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment()
    }
    wg.Wait()
    fmt.Println("Final counter value:", counter)
}

在这个例子中,多个 goroutine 同时对 counter 变量进行递增操作,由于没有同步机制,会产生资源竞争,导致 counter 的最终值不可预测。

  1. 通道操作竞争
package main

import (
    "fmt"
    "sync"
)

func sendData(ch chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}

func receiveData(ch chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for val := range ch {
        fmt.Println("Received:", val)
    }
}

func main() {
    var wg sync.WaitGroup
    ch := make(chan int, 5)

    wg.Add(2)
    go sendData(ch, &wg)
    go receiveData(ch, &wg)

    wg.Wait()
}

如果多个 sendData 函数尝试同时向 ch 通道发送数据,而通道容量有限,就可能在通道满时产生竞争。如果没有合理的同步,程序行为将不可预测。