Sobes.tech
Назад к вопросам
Middle+
9

Как исправить код с race condition, чтобы он работал детерминированно?

Компании, где спрашивали
OZONOZON

Ответ от нейросети

sobes.tech AI

Race condition возникает, когда несколько горутин (потоков) одновременно обращаются к общим данным без должной синхронизации, что приводит к непредсказуемому поведению программы.

Чтобы исправить код и сделать его детерминированным, нужно использовать механизмы синхронизации:

  • Mutex (sync.Mutex) — блокирует доступ к общим данным, позволяя работать с ними только одной горутине за раз.
  • Channel — для передачи данных между горутинами, что позволяет избежать совместного доступа.
  • sync.WaitGroup — для ожидания завершения горутин.

Пример исправления с использованием мьютекса:

package main

import (
	"fmt"
	"sync"
)

func main() {
	var mu sync.Mutex
	counter := 0
	var wg sync.WaitGroup

	for i := 0; i < 100; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			mu.Lock()
			counter++
			mu.Unlock()
		}()
	}

	wg.Wait()
	fmt.Println("Counter:", counter)
}

В этом примере мьютекс гарантирует, что инкремент счетчика происходит последовательно, исключая гонки и обеспечивая детерминированный результат.