Как .bss используется потоками

«Как .bss используется потоками» — вопрос из категории Linux, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сегмент .bss (Block Started by Symbol) содержит неинициализированные глобальные и статические переменные, которые автоматически заполняются нулями при запуске программы. В многопоточной среде:

  • Каждый поток имеет доступ к общим переменным в .bss, если они объявлены как глобальные/статические
  • Для потокобезопасности нужна синхронизация (мьютексы, атомарные операции)
  • Локальные переменные потоков хранятся в стеке потока, а не в .bss

Пример:

var globalCounter int // в .bss

func worker() {
    globalCounter++ // требует синхронизации!
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            worker()
        }()
    }
    wg.Wait()
    fmt.Println(globalCounter) // результат недетерминирован
}