2017-02-10 2 views
2

Я пытаюсь создать канал, который используется, чтобы убедиться, что все готово,Блокировка по каналу в другом месте только с одним сообщением в Голанге?

так что я могу продолжить процесс, примером может быть такой: playground

package main 

import (
    "fmt" 
) 

// done sends the channel a "okay" status. 
func done(ok chan<- bool) { 
    ok <- true 
} 

// waiting is a function that waiting for everything's okay. 
func waiting(ok <-chan bool) { 
    <-ok 

    // Do something here 
    // when everything's okay... 
} 

func main() { 
    ok := make(chan bool) 

    // Send the "ok" status once. 
    go done(ok) 

    // function A mockup 
    waiting(ok) 
    // function B mockup 
    waiting(ok) 

    fmt.Println("All Ok!") 
} 

и вот выход:

fatal error: all goroutines are asleep - deadlock! 

goroutine 1 [chan receive]: 
main.main() 
    /tmp/sandbox709143808/main.go:29 +0xc0 

Я освобожденный послать ok <- trueраз,

то я могу использовать его в нескольких местах, и получить выход так:

All Ok! 

Program exited. 

, но я не уверен, как это сделать, какие-либо идеи?

ответ

2

Вы можете закрыть isstead канал отправки сообщения .Closing будет действовать так, как будто хорошо транслируется на все прослушивания froutines

Код

package main 

import (
    "fmt" 
) 

// done sends the channel a "okay" status. 
func done(ok chan<- bool) { 
    close(ok) 
} 

// waiting is a function that waits for everything's okay. 
func waiting(ok <-chan bool) { 
    <-ok 

    // Do something here 
    // when everything's okay... 
} 

func main() { 
    ok := make(chan bool) 

    // Send the "ok" status once. 
    go done(ok) 
    //go done(ok) 

    // function A mockup 
    waiting(ok) 
    // function B mockup 
    waiting(ok) 

    fmt.Println("All Ok!") 
} 

Вот ссылка игры play.golang