MST

星途 面试题库

面试题:Go语言布尔类型在并发逻辑判断中的应用

在一个并发的Go程序中,有多个协程分别计算不同的布尔结果,这些结果存储在一个布尔类型的切片 `results` 中。要求编写代码实现在所有协程完成后,判断切片中是否至少有一个 `true` 值,如果有则返回 `true`,否则返回 `false`。请考虑如何正确地处理并发同步问题,避免竞态条件,并且分析在这种并发场景下,布尔类型在逻辑判断过程中的潜在风险和应对策略。
37.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    results := make([]bool, 5)

    for i := range results {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            // 模拟计算布尔结果,这里简单赋值为index % 2 == 0
            results[index] = index % 2 == 0
        }(i)
    }

    go func() {
        wg.Wait()
        hasTrue := false
        for _, result := range results {
            if result {
                hasTrue = true
                break
            }
        }
        fmt.Println(hasTrue)
    }()

    select {}
}

布尔类型在逻辑判断过程中的潜在风险和应对策略

  1. 潜在风险:在并发场景下,多个协程同时访问和修改布尔类型的变量可能导致竞态条件。例如,一个协程可能在另一个协程检查布尔值之后但在修改之前读取该值,导致逻辑判断错误。
  2. 应对策略
    • 使用互斥锁(sync.Mutex:通过互斥锁保护对布尔变量的访问,确保同一时间只有一个协程可以读取或修改该变量。
    • 使用原子操作:Go语言的atomic包提供了原子操作函数,可用于对布尔类型(实际使用int32int64来模拟布尔值)进行无锁的原子读写操作,避免竞态条件。在上述代码中,由于对results切片的操作是在每个协程独立进行的,并且最终的逻辑判断是在所有协程完成后进行,所以不会出现对单个布尔值的并发读写问题,但在更复杂场景下需注意上述潜在风险及应对策略。