에 있습니다. 처방대로, foo
과 bar
이 동시 goroutines에서 실행되며, 둘 중 하나 또는 둘 다 시작된 경우 다른 하나는 완료 될 때까지 기다려야한다고 말합니다. 그것은 처방전이 너무 약합니다. foo
이 시작된 후 끝나지 만 bar
이 아직 실행되지 않으면 어떻게됩니까? bar
전혀 실행되지 않으면 어떻게됩니까? 또는 bar
이 실행되면 foo
이 실행되지 않으면 어떻게됩니까?
foo
과 bar
모두 프로그램을 올바르게 시작하기 위해 시작해야하며 완료해야합니까? 그렇다면 당신이 처방하려는 내용을 짐작할 수 있습니다 : 진행하기 전에 모두 완료되기를 기다리는 barrier을 원합니다.
package main
import (
"fmt"
"sync"
"time"
)
func foo() {
fmt.Println("foo")
}
func bar() {
fmt.Println("bar")
}
func within(wg sync.WaitGroup, f func()) {
wg.Add(1)
go func() {
defer wg.Done()
f()
}()
}
func main() {
var wg sync.WaitGroup
within(wg, foo)
within(wg, bar)
wg.Wait()
fmt.Println("Both foo and bar completed.")
}
(That same example in the Playground) 여기, foo
도 bar
도 상호 인식
참고; 두 사람의 전화를 조화시키기 위해 전화 한 사람 만 있습니다. foo
및 bar
각각 종료하기 전에 adding itself to the group 및 waiting on it 먼저 각 기능, 매개 변수 sync.WaitGroup
로여 닫거나 동의를 만드는 길을 당신을 이끌 수
원래 시도. 그 방법은 광기를 속인다.
만약 foo
가 시작되고 bar
이 WaitGroup
에 자신을 추가 할 수있는 기회를하기 전에, foo
당신이 그들이 동시에 실행했다 주장, 또는 foo
가 활성을 등록 할 수 있습니다 전에 bar
실행과 대화 할 수있다하더라도, bar
전에 종료됩니다 완료 상태. 다시 말하지만, 이것은 프로그램의 잘못 지정된 부분이기 때문에,이 두 함수의 상호 의존성이 아니라 상위 레벨의 장벽에 집중하는 것이 좋습니다.
출처
2017-09-18 00:15:49
seh
관련/가능한 [이 골란 코드에 문제가 있습니까?] (https://stackoverflow.com/questions/28958192/whats-wrong-with-this-golang-code?noredirect=1&lq=1) – icza
요구 사항이 제대로 처리되어야하는 엄청난 수의 경쟁 조건을 야기합니다 (다른 루틴이 사후 점검 직후에 끝나면 어떻게됩니까? 네거티브 체크 후에 다른 루틴을 시작하면 어떻게됩니까?) 누군가가 foo의 2 루틴을 실행하면()) 나는 당신이 서로 독립적 인 달리기 상태에 상호 의존적 인 2 개의 goroutine을 가지지 않는 더 나은 디자인을 만들 것을 강력하게 촉구한다. – nos
질문에있는 코드는 @nos로 표시된 교착 상태가 있습니다. 주어진 시나리오에서 작동 할 솔루션이 없습니다. – Adrian