2012-12-03 11 views
13

to go zważywszy na poniższym przykładzie: http://play.golang.org/p/owvJ8Oi77Swątku bezpieczny sposób do komina danych z wielu procedur

func produce(dataChannel chan int) { 
    for i := 0; i < 10; i++ { 
     dataChannel <- i 
    } 
} 

func main() { 
    dataChannel := make(chan int) 

    go produce(dataChannel) 
    go produce(dataChannel) 
    go produce(dataChannel) 

    for i := 0; i < 30; i++ { 
     data := <-dataChannel 
     fmt.Printf("%v ", data) 
    } 
} 

Czy moje założenie, że pisanie do kanału z wielu procedur niebezpieczne to go prawidłowe?

Czy istnieje wspólny/idiomatyczny sposób na bezpieczne wykonanie tej czynności? Wiem, że możesz stworzyć oddzielny kanał dla każdej rutyny, która produkuje dane, zastanawiałem się tylko, czy to było najczystsze rozwiązanie, czy istnieją inne alternatywy.

+2

Jedyną szczególną cechą kanału pod tym względem jest to, że można je zamknąć tylko raz i nic nie może zostać wysłane po zamknięciu kanału. Aby to lepiej zrozumieć, spróbuj zmodyfikować swój przykład, aby uzyskać zasięg nad kanałem zamiast ustalonego rozmiaru i działać, dopóki nie zostanie ukończony. Nieco trudniejsze, ale dobrze to zrozumieć. – Dustin

+0

Tak, moim głównym zmartwieniem było pisanie do tego samego kanału z wielu procedur/wątków. Nie było dla mnie jasne, że można to bezpiecznie zrobić. – Chris

Odpowiedz

21

Kanały są całkowicie bezpieczne dla wątków. Są oficjalnym sposobem komunikowania się między goroutinami. Nie widzę nic złego w twoim kodzie. To jest piękno Go.

4

Kanały są przeznaczone do dzielenia między wątkami (i jest to normalne znaczenie "bycia bezpiecznym dla wątków"). Używanie kanałów oznacza, że ​​NIE posiadasz pamięci współdzielonej z niebezpieczeństwami, które możesz zaryzykować. Tak więc odpowiedź Daniela jest prawidłowa: używaj kanałów, bo do tego właśnie służą.

Należy jednak pamiętać, że goroutiny tworzą sieci komunikujące się z sekwencyjnymi procesami, które mogą czasami zakleszczyć, jeśli wystąpił błąd projektowy. Mogą również sterować livelockiem (to samo, ale jest zajęty).

Istnieje spory zasób wiedzy na temat unikania zakleszczenia/blokady na żywo. Wiele z nich pochodzi z czasów, gdy Ockhama był popularny w latach 80. i 90. XX wieku. Istnieje kilka specjalnych klejnotów od ludzi, takich jak Jeremy Martin (Design Strategy for Deadlock-Free Concurrent Systems), Peter Welch (Higher Level Paradigms) i innych.

Powiązane problemy