MST
星途 面试题库

面试题:Go语言中如何在并发场景下进行函数测试及处理竞争条件

假设有一个并发场景的函数`func ConcurrentTask() { var count int; var wg sync.WaitGroup; for i := 0; i < 10; i++ { wg.Add(1); go func() { defer wg.Done(); count++ }() }; wg.Wait(); fmt.Println(count) }`,请编写测试代码对其进行测试,确保在并发执行时`count`的计算结果正确,同时要处理可能出现的竞争条件,说明你采用的测试策略和工具。
33.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
    "testing"
)

func ConcurrentTask() {
    var count int
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            count++
        }()
    }
    wg.Wait()
    fmt.Println(count)
}

func TestConcurrentTask(t *testing.T) {
    var mu sync.Mutex
    var count int
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            mu.Lock()
            count++
            mu.Unlock()
        }()
    }
    wg.Wait()
    if count != 10 {
        t.Errorf("Expected count to be 10, but got %d", count)
    }
}

测试策略

  1. 使用互斥锁(Mutex):在TestConcurrentTask函数中,通过sync.Mutex来保护对共享变量count的访问,以避免竞争条件。每个goroutine在修改count之前先获取锁,修改完成后释放锁。
  2. 验证结果:在所有goroutine执行完毕后,检查count的值是否等于预期的10。如果不等于10,则使用t.Errorf输出错误信息。

工具

  1. Go语言自带的testing包:用于编写和运行单元测试。testing.T提供了断言和错误报告的功能,例如t.Errorf用于报告测试失败。
  2. sync包:提供了sync.Mutex互斥锁来处理并发访问共享资源时的竞争条件,以及sync.WaitGroup来同步多个goroutine的执行。