var a string var done bool func setup() { a = "hello, world" done = true } func doprint() { if !done { once.Do(setup) } print(a) } func twoprint() { go doprint() go doprint() }
변수:
기능:
main()의 동시성:
잠재적인 문제:
가능한 결과
동기화가 부족하기 때문에 프로그램의 출력은 비결정적입니다. 가능한 시나리오는 다음과 같습니다.
사례 1: f()가 a와 b를 수정하기 전에 g()가 실행됩니다.
0 0
또는
사례 2: g() 전에 b = 2가 완료되었지만 a = 1이 완료되지 않은 경우 출력은 다음과 같습니다.
2 0
주요 관찰
데이터 경쟁: 동기화 없이 a와 b에 동시에 액세스하면 데이터 경쟁이 발생합니다. 이로 인해 프로그램의 동작이 정의되지 않고 예측할 수 없게 됩니다
코드 수정
var a, b int var wg sync.WaitGroup func f() { a = 1 b = 2 wg.Done() } func g() { print(b) print(a) } func main() { wg.Add(1) go f() wg.Wait() g() }
var a, b int func f(done chan bool) { a = 1 b = 2 done <- true } func g() { print(b) print(a) } func main() { done := make(chan bool) go f(done) <-done g() }
여기서 g()는 f()가 완료된 채널을 통해 신호를 보낼 때까지 기다립니다.
위 내용은 GO:동기화 부족의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!